python日誌模塊筆記

前言

在應用中記錄日誌是程序開發的重要一環,也是調試的重要工具。但卻很容易讓人忽略。之前用flask寫的一個服務就因爲沒有處理好日誌的問題導致線上的錯誤難以察覺,修復錯誤的定位也很困難。最近恰好有時間可以梳理一下python日誌的功能,下面是一點筆記。

使用

python標準庫中提供了記錄日誌的方案。

import logging 
from logging.config import dictConfig


logger = logging.getLogger(__name__)

# 定義格式
formatter = logging.Formatter(fmt='%(asctime)s %(name)-12s %(levelname)-8s %(message)s')

# 定義日誌處理器
streamHdl = logging.StreamHandler()

# 設定日誌級別
streamHdl.setLevel(logging.DEBUG)

# 設定日誌格式
streamHdl.setFormatter(formatter)

# 給日誌器添加日誌處理器
logger.addHandler(streamHdl)


# 記錄日誌
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()

從上面的演示這個模塊的使用是比較簡單的。但在應用中深入使用有些需要注意的地方:

parent logger / child logger

在多模塊程序中使用多個模塊是很常見的,被引用模塊中的日誌對象容易讓人迷惑。我們知道一個應用有一個唯一的文件入口,如果這個入口文件中定義了logger,那這個logger就是parent logger, 其中被導入的模塊中定義的logger就是child logger, 與我們常見的在一個模塊中實例化使用不同,在每一個需要記錄日誌的地方都需要產生一個logger,然後進行日誌記錄操作。每個模塊內部所記錄的日誌根據每個logger的配置信息對日誌進行操作,然後根據該logger是否反向傳遞到parent logger進一步操作。反向傳遞到parent logger之後,依舊像普通的logger一樣對日誌進行處理。

日誌的配置

https://docs.python.org/3/howto/logging.html#configuring-logging
每個logger都可以通過ini文件、yarm文件、對象等形式進行配置,這裏主要講以字典形式進行的配置。


logging_config = dict(
    version=1,
    formatters={
        'f': {'format':
                  '%(asctime)s000000 %(name)-12s %(levelname)-8s %(message)s'}
    },
    handlers={
        'h': {'class': 'logging.StreamHandler',
              'formatter': 'f',
              'level': logging.DEBUG}
    },
    root={
        'handlers': ['h'],
        'level': logging.DEBUG,
    },
)
dictConfig(logging_config)

當在一個文件中使用dictConfig,就給該文件的logger定義了配置。

異常的捕捉

logger.error()與logger.exception()之間的區別在於error()只會打印一句話,而exception()則會將異常的錯誤棧都會打印出來。對於出現代碼異常的地方,可以使用exception()用作記錄。

普通日誌直接使用logging模塊來記錄,應用內不處理日誌的去向,作爲事件流統一輸出到標準輸出,採用第三方日誌採集工具進行捕獲和處理。但也不能太絕對,如果外部收集日誌的程序缺少對日誌級別分類,或者對異常記錄缺少必要的支持,就需要內置的模塊進行處理。

常用的內置handler

    https://docs.python.org/3/howto/logging.html#useful-handlers

參考

https://12factor.net/logs
https://docs.python.org/3/howto/logging.html
https://docs.python.org/3/howto/logging-cookbook.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章