Python 日誌輸出

2021-07-30 01:44:50 字數 4047 閱讀 6374

列印日誌是很多程式的重要需求,良好的日誌輸出可以幫我們更方便的檢測程式執行狀態。python標準庫提供了logging模組,讓我們也可以方便的在python中列印日誌。

完整的使用方法可以參考標準庫文件。這裡做一下簡單介紹。

日誌級別有如下幾種。當獲取根logger的時候,預設級別為notset,這樣會顯示所有輸出。當獲取非根logger的時候,根logger的預設級別是warning,非根logger會繼承這個級別,只有warning以上的日誌才會輸出。

級別數值

critical

50error

40warning

30info

20debug

10notset

0日誌物件通過模組的getlogger(name)函式獲得,可以向該函式傳遞乙個名稱。如果不傳遞名字的話,就會獲取根logger。

日誌物件常用方法如下。

方法名作用

setlevel(lvl)

設定日誌級別

isenabledfor(lvl)

檢查某級別的日誌是否啟用

geteffectivelevel()

獲取實際的日誌級別

debug/warning/info/error(msg, *args, **kwargs)輸出對應級別的日誌

log(lvl, msg, *args, **kwargs)輸出指定級別的日誌

addfilter(filt)/removefilter(filt)

新增或刪除指定的過濾器

addhandler(hdlr)/removehandler(hdlr)

新增或刪除指定的處理器

日誌物件用於輸出日誌,而handler物件用於指定日誌向**輸出(檔案、終端等等)。handler列表可以參考handler型別。

常用的handler有以下幾種:

過濾器物件用於過濾日誌的輸出。

logrecord物件基本上和我們沒多大關係,簡單地說,我們輸出的每一條日誌,就是乙個logrecord物件。它有日誌系統自動建立和使用。如果我們留心一下日誌模組的方法,會發現有很多地方都要接受logrecord引數。logrecord有很多屬性資訊,對日誌列印有幫助,可以參考16.6.6. logrecord objects下面的屬性和格式化符的對照表。例如%(asctime)s會生**類可讀的時間戳,%(lineno)d返回當前行號等等。

日誌模組還包含了一些模組級別的函式。簡單不完整列舉如下:

函式名作用

getlogger(name=none)

獲取對應名稱的logger,如果不指定名稱會返回根logger

debug/info等函式

在根logger上列印對應級別的日誌資訊

disable(lvl)

禁用某級別的日誌列印

basicconfig(關鍵字引數)

這個函式可以快速設定日誌的級別、格式、handler、formatter等

前面都是紙面上的介紹,下面來真正使用日誌模組來列印日誌。下面的**所用知識,前面都已介紹過。執行**之後,可以驗證日誌同時在終端輸出和檔案中輸出。

import logging

# 建立logger

logger = logging.getlogger()

logger.setlevel(logging.debug)

# 建立handler

# 終端handler

consolehandler = logging.streamhandler()

consolehandler.setlevel(logging.debug)

# 檔案handler

filehandler = logging.filehandler('log.log', mode='w', encoding='utf-8')

filehandler.setlevel(logging.notset)

# formatter

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

consolehandler.setformatter(formatter)

filehandler.setformatter(formatter)

# 新增到logger中

logger.addhandler(consolehandler)

logger.addhandler(filehandler)

# 列印日誌

logger.debug('debug 資訊')

logger.info('info 資訊')

logger.warning('warn 資訊')

logger.error('error 資訊')

logger.critical('critical 資訊')

logger.debug('%s 是自定義資訊' % '這些東西')

執行結果。

2017-04-04 21:45

:16,742 -

root

-debug

-debug 資訊

2017-04-04 21:45

:16,742 -

root

-info

-info 資訊

2017-04-04 21:45

:16,742 -

root

-warning

-warn 資訊

2017-04-04 21:45

:16,742 -

root

-error

-error 資訊

2017-04-04 21:45

:16,742 -

root

-critical

-critical 資訊

2017-04-04 21:45

:16,742 -

root

-debug

- 這些東西 是自定義資訊

前面都是在**中配置日誌的輸出,我們還可以將配置寫到配置檔案中,然後傳遞給日誌模組。舊式程式會使用conf格式配置檔案,不過這種配置檔案比較傳統,所以就不介紹了。

自python 3.2起,引入了一種新的基於鍵值對的配置方式。這種新方式的優點是配置檔案非常靈活,我們可以使用xml、yaml、json等格式儲存配置,也可以從網路上接收序列化的python物件當做配置物件。總之,想怎麼來就怎麼來。我們下面就介紹這種新方式。

具體的鍵值對需要參考官方文件。例如下面就是python官方給出的乙個yaml格式的配置檔案。

version: 1

formatters:

******:

format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

handlers:

console:

class: logging.streamhandler

level: debug

formatter: ******

stream: ext:

loggers:

main:

level: debug

handlers: [console]

propagate: no

root:

level: debug

handlers: [console]

然後引入logging.config模組,並將配置檔案傳遞給logging.config模組的dictconfig方法。這樣就做好了日誌列印的準備工作了。

import logging.config

logging.config.dictconfig('config.yaml')

logger = logging.getlogger('****')

python日誌輸出

import logging logger logging.getlogger 生成乙個日誌物件,內為日誌物件的名字,可以不帶,名字不給定就是root,一般給定名字,否則會把其他的日誌輸出也會列印到你的檔案裡。handler logging.filehandler log test.txt 生成乙個...

Python 日誌輸出

指令碼案例 import logging logging logging.getlogger logger.setlevel logging.info consolehandler logging.streamhandler logger.addhandler consolehandler logg...

python 輸出日誌

專案路徑 prj path os.path.dirname os.path.abspath file 當前檔案的上一級的上一級目錄 增加一級 在專案路徑下建立乙個log資料夾,拼接成路徑格式 log path os.path.join prj path,log 在log資料夾下再建立乙個以當前日期命...