Python logging 模塊簡介

Logging 模塊<a id="sec-1" name="sec-1"></a>

簡介<a id="sec-1-1" name="sec-1-1"></a>

Python的 logging 模塊提供了靈活的日志處理相關功能, 可以用來追蹤程序運行的情況。

logging 模塊提供了一系列標準的日志等級: DEBUG, INFO, WARNING, ERROR, CRITICAL, 顧名思義可以大致看出它們各自的使用情況。 logging 模塊設置的默認等級時 WARNING, 這意味著默認情況下,日志級別為 WARNING, ERROR, CRITICAL 的日志會被記錄,而 DEBUG, INFO 的日志會被忽略。

不同等級的value值如下,只有當value大于 logger 的值才會記錄日志。

Level    Value
CRITICAL 50
ERROR    40
WARNING  30
INFO     20
DEBUG    10
UNSET     0

簡單輸出日志<a id="sec-1-2" name="sec-1-2"></a>

下面看一個簡單的官方文檔上的例子:

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything

輸出如下:

WARNING:root:Watch out!

可以看到info記錄的信息沒有輸出,這是因為默認輸出級別不低于WARNING級別的。

輸入日志到文件<a id="sec-1-3" name="sec-1-3"></a>

logging 支持輸出日志到文件,參考下面示例:

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

其中l(wèi)evel是指的記錄等級, 輸出如下:

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

幾個基本概念<a id="sec-1-4" name="sec-1-4"></a>

loggers<a id="sec-1-4-1" name="sec-1-4-1"></a>

logger是logging模塊提供的日志類 Logger 的實例,它暴露出接口可以直接供程序調用。
每個實例都有一個名字,并且示例間有類之間那種繼承關系,根據(jù)logger的名字來區(qū)分,比如叫"scan"的logger是叫"scan.text"和"scan.html"的父類(沒錯,他們是以點號錯分隔符)。

所有l(wèi)ogger共同的父類是 root , 就是上面示例中的中間那個默認的root。 basicConfig 默認的輸出格式為: severity:logger name:message 。

logger的通過 logging.getLogger(name) 來創(chuàng)建,有種在包里命名的慣用做法是:

logger = logging.getLogger(__name__)

這樣的好處是可以從logger的名字清楚的看到記錄的來源。

handlers 和輪轉日志<a id="sec-1-4-2" name="sec-1-4-2"></a>

handlers 承擔 logging 模塊里負責處理合適的信息到不同的地方的角色,下面通過設置一個RotatingFileHandler來展示handler的特性。

有時候需要創(chuàng)建多個輪轉日志,每個日志保存一定長度的內容,最多保留一定數(shù)量的日志,其余的丟棄,這種情況下,可以定義 RotatingFileHandler 來實現(xiàn):

logging_rotatingfile_example.py
import glob
import logging
import logging.handlers

LOG_FILENAME = 'logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
    LOG_FILENAME,
    maxBytes=20,
    backupCount=5,
)
my_logger.addHandler(handler)

# Log some messages
for i in range(20):
    my_logger.debug('i = %d' % i)

# See what files are created
logfiles = glob.glob('%s*' % LOG_FILENAME)
for filename in logfiles:
    print(filename)

運行輸出如下:

logging_rotatingfile_example.out
logging_rotatingfile_example.out.1
logging_rotatingfile_example.out.2
logging_rotatingfile_example.out.3
logging_rotatingfile_example.out.4
logging_rotatingfile_example.out.5

當日志內容達到定義的 maxBytes 時,會自動重命名文件后加上后綴".1",如果已經(jīng)存在后續(xù)的".1",".2"等則自動重命名他們向后加1,最后最多只保留 backupCount 定義數(shù)量的日志文件。

其它有用的handler參見這里

Formatters 和 個性化輸出<a id="sec-1-4-3" name="sec-1-4-3"></a>

Formatters 可以用來控制日志輸出的格式,參考下面的示例:

import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

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

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

輸出如下:

2016-11-27 23:18:51,128 - simple_example - DEBUG - debug message
2016-11-27 23:18:51,128 - simple_example - INFO - info message
2016-11-27 23:18:51,128 - simple_example - WARNING - warn message
2016-11-27 23:18:51,128 - simple_example - ERROR - error message
2016-11-27 23:18:51,128 - simple_example - CRITICAL - critical message

可以看到 %(asctime)s - %(name)s - %(levelname)s - %(message)s 這里對格式化輸出的影響。
其中默認的日期時間顯示的格式是ISO8601格式, 也可以自定義時間格式,如下面的例子:

import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

輸出:

python test12.py
11/27/2016 11:22:41 PM is when this event was logged.

好有個比較有用的格式化參數(shù)時 %(lineno)d, 顯示logger調用的時候所處的行數(shù)。具體的格式和作用可以參見這里。

其它<a id="sec-1-5" name="sec-1-5"></a>

logger.exception<a id="sec-1-5-1" name="sec-1-5-1"></a>

ERROR 的等級記錄日志,但和 DEBUG 等級一樣會輸出詳細的錯誤信息,通常用在exception處理中

Filter Object<a id="sec-1-5-2" name="sec-1-5-2"></a>

Filters 是可以被handlers和loggers用來過濾日志的輸出的,因為用的不多,具體可參見文檔。

線程安全<a id="sec-1-5-3" name="sec-1-5-3"></a>

logging模塊是通過線程鎖保證線程安全的。

Logging Flow<a id="sec-1-5-4" name="sec-1-5-4"></a>

官方文檔上看到的logging流程圖,可以幫助理解日志記錄流程,參見這里。

從配置文件獲取logging的配置<a id="sec-1-5-5" name="sec-1-5-5"></a>

參見這里

參考資料<a id="sec-2" name="sec-2"></a>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 本文章是我大概三年前,在上家單位使用 Python 工作時結合官方文檔做的整理?,F(xiàn)在 Python 官方文檔聽說已...
    好吃的野菜閱讀 218,008評論 14 232
  • Python logging 模塊 參考 http://blog.csdn.net/zyz511919766/ar...
    ktide閱讀 1,007評論 0 2
  • logging模塊介紹: logging是python內置的標準庫模塊,模塊提供不同的日志級別,并可以采用不同的方...
    4ffde5305e8f閱讀 2,988評論 0 2
  • 本文翻譯自logging howto 基礎教程 日志是跟蹤軟件運行時發(fā)生事件的一種手段。Python開發(fā)者在代碼中...
    大蟒傳奇閱讀 4,350評論 0 17
  • 一 我是鐘意,想要說自己故事給你們聽的鐘意。 我是女孩,對自己性別不是很認同的女孩。 第一次真正對女孩動心是十七歲...
    玄子Chris閱讀 1,335評論 21 11

友情鏈接更多精彩內容