Python日誌模組之你還在用PRINT列印日誌嗎

2022-06-23 22:27:17 字數 4815 閱讀 2162

import

logging

logging.basicconfig(level=logging.debug,

format='

%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

datefmt='

%a, %d %b %y %h:%m:%s',

filename='

test.log',

filemode='w'

)logging.debug(

'debug level')

logging.info(

'info level')

logging.warning(

'warning level')

logging.error(

'error level')

logging.critical(

'critical level

')

我們知道在日常寫python程式的時候開業用print來列印一些日誌,當然在小的程式裡不用出現什麼問題,但是你有沒有想過當你的**量到成千上萬行的時候,還是用print來列印,那就是災難,今天就給大家介紹下python中的日誌模組 logging模組。

logging可以分成兩部分來講

1.logging, 重點在於logging.basicconfig

2.logger物件,重點在於filehandler(用於向檔案輸出)和streamhandler(用於向控制檯輸出)

下面看看案例

方法一logging (注意我們新建py檔案的時候,py檔名不要和包的名稱一樣,就是py檔名字不要建成logging.py, 不然會報錯)

import logging

logging.debug('debug level')

logging.info('info level')

logging.warning('warning level')

logging.error('error level')

logging.critical('critical level')

結果:warning:root:warning level

error:root:error level

critical:root:critical level

我們會發現下面2個沒有輸出到控制檯,這是因為我們python裡面的預設日誌級別是warning

logging.debug('debug level')

logging.info('info level')

下面我們自己設定下日誌級別看看,也就是logging模組的重點logging.basicconfig

import logging

logging.basicconfig(level=logging.debug,

format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

datefmt='%a, %d %b %y %h:%m:%s',

filename='test.log',

filemode='w')

logging.debug('debug level')

logging.info('info level')

logging.warning('warning level')

logging.error('error level')

logging.critical('critical level')

我們會發現控制檯沒有輸出,但是py檔案的同路徑出現一個test.log的日誌檔案

或者我們不加filename='test.log'

import logging

logging.basicconfig(level=logging.debug,

format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

datefmt='%a, %d %b %y %h:%m:%s',

# filename='test.log',

filemode='w')

logging.debug('debug level')

logging.info('info level')

logging.warning('warning level')

logging.error('error level')

logging.critical('critical level')

結果sun, 24 mar 2019 11:37:26 log.py[line:9] debug debug level

sun, 24 mar 2019 11:37:26 log.py[line:10] info info level

sun, 24 mar 2019 11:37:26 log.py[line:11] warning warning level

sun, 24 mar 2019 11:37:26 log.py[line:12] error error level

sun, 24 mar 2019 11:37:26 log.py[line:13] critical critical level

控制檯完整輸出了從debug到critical的日誌,而且是按照我們要想的格式

是不是更賞心悅目了呢

下面是basicconfig的引數介紹,**於網路擷取(

侵權刪logging.basicconfig()函式中可通過具體引數來更改logging模組預設行為,可用引數有:

filename:用指定的檔名建立filedhandler,這樣日誌會被儲存在指定的檔案中。

filemode:檔案開啟方式,在指定了filename時使用這個引數,預設值為“a”還可指定為“w”。

format:指定handler使用的日誌顯示格式。

datefmt:指定日期時間格式。

level:設定rootlogger(後邊會講解具體概念)的日誌級別

stream:用指定的stream建立streamhandler。可以指定輸出到sys.stderr,sys.stdout或者檔案(f=open(‘test.log’,’w’)),預設為sys.stderr。若同時列出了filename和stream兩個引數,則stream引數會被忽略。

format引數中可能用到的格式化串:

%(name)s logger的名字

%(levelno)s 數字形式的日誌級別

%(levelname)s 文字形式的日誌級別

%(pathname)s 呼叫日誌輸出函式的模組的完整路徑名,可能沒有

%(filename)s 呼叫日誌輸出函式的模組的檔名

%(module)s 呼叫日誌輸出函式的模組名

%(funcname)s 呼叫日誌輸出函式的函式名

%(lineno)d 呼叫日誌輸出函式的語句所在的**行

%(created)f 當前時間,用unix標準的表示時間的浮 點數表示

%(relativecreated)d 輸出日誌資訊時的,自logger建立以 來的毫秒數

%(asctime)s 字串形式的當前時間。預設格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒

%(thread)d 執行緒id。可能沒有

%(threadname)s 執行緒名。可能沒有

%(process)d 程序id。可能沒有

%(message)s使用者輸出的訊息

那說到這裡有人是不是就發現了,上面的方式要不就是把日誌輸出到控制檯,要不就是輸出到日誌檔案,那麼如果我即想輸出到控制檯也想輸出到檔案, 那怎麼辦呢?那就要用我們今天說的第二種方法 logger物件。

2. logger物件,這樣就可以同時向檔案和控制檯列印日誌了,解釋都在**裡。

import logging

#固定寫法

# logger = logging.getlogger()

logger = logging.getlogger('mylogger')

#設定日誌級別

logger.setlevel(logging.debug)

# 建立一個filehandler,用於寫入日誌檔案

file = logging.filehandler('test.log')

# 再建立一個streamhandler,用於輸出到控制檯

consle = logging.streamhandler()

#定義輸出格式,可以自己定

formatter = logging.formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#繫結格式和filehandler,streamhandler

file.setformatter(formatter)

consle.setformatter(formatter)

#logger物件可以新增多個filehandler和consle物件

logger.addhandler(file)

logger.addhandler(consle)

#輸出logger.debug('logger debug level')

logger.info('logger info level')

logger.warning('logger warning level')

logger.error('logger error level')

logger.critical('logger critical level')