天天看點

Python 項目标準庫中的 logging 如何使用?

作者:小逗IT

Python标準庫logging常用的日志實作類有:StreamHandler和TimeRotatingFileHandler,

這兩者組合,可以實作按天記錄日志及實作了日志控制台上的輸出,在我們日志工作中已經

夠用了,不過Python在日志實作上,還提供了其他的Handler,具體前往logging.handlers檢視。

下面是一段代碼,結合代碼我們介紹logging的用法:

from logging.handlers import TimedRotatingFileHandler

file_handler = TimedRotatingFileHandler(filename=LOG_FILE, when="MIDNIGHT", interval=1, backupCount=30)
console_handler = logging.StreamHandler()  # 輸出到控制台
file_handler.setLevel('INFO')  # 定義日志等級,這裡INFO以上才輸出到檔案
console_handler.setLevel('INFO')  # 定義日志等級,這裡INFO以上才輸出到控制台           

上面分别定義了檔案和控制台的日志記錄handler,日志級别是INFO,日志級别定義大家非

常熟悉,跟Java是一樣的,但這裡有幾個參數非常重要:

  • interval:日志滾動周期
  • when:時間間隔類型,具體類型請參考下表。
  • backupCount:該參數決定了能留幾個日志檔案。
Python 項目标準庫中的 logging 如何使用?

舉例:

when='D',interval=2,backupCount=30           

就是每2天生成一個日志檔案,保留30個日志檔案。

when="MIDNIGHT", interval=1, backupCount=30           

表示每天0點為更新點,每天生成一個檔案。

下面這段代碼是日志格式定義:

fmt = '[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s'
formatter = logging.Formatter(fmt)
file_handler.setFormatter(formatter)
# filename="mylog" suffix設定,會生成檔案名為mylog.2020-02-25.log
file_handler.suffix = "%Y-%m-%d.log"
# extMatch是編譯好正規表達式,用于比對日志檔案名字尾
# 需要注意的是suffix和extMatch一定要比對的上,如果不比對,過期日志不會被删除。
file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log#34;)
console_handler.setFormatter(formatter)
logger = logging.getLogger(__file__)
logger.setLevel('INFO')
logger.addHandler(file_handler)
logger.addHandler(console_handler)           

format格式字元串定義說明:

  • %(asctime)s | 日志事件發生的時間,如:2003-07-08 16:49:45,896
  • %(created)f | 日志事件發生的時間。
  • %(msecs)d | 日志事件發生事件的毫秒部分
  • %(levelname)s | 日志級别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
  • %(name)s | 日志器名稱,預設是'root'
  • %(message)s | 日志記錄的文本内容
  • %(pathname)s | 調用日志記錄函數的源碼檔案的全路徑
  • %(filename)s | pathname的檔案名部分,包含檔案字尾
  • %(module)s | filename的名稱部分,不包含字尾
  • %(lineno)d | 調用日志記錄函數的源代碼所在的行号
  • %(funcName)s | 調用日志記錄函數的函數名
  • %(process)d | ID
  • %(processName)s | 程序名稱,Python 3.1新增
  • %(thread)d | 線程ID
  • %(thread)s | 線程名稱

生成的日志:

Python 項目标準庫中的 logging 如何使用?

完整Demo:

from logging.handlers import TimedRotatingFileHandler
LOG_FILE = '/tmp/car.log'
file_handler = TimedRotatingFileHandler(filename=LOG_FILE, when="MIDNIGHT", interval=1, backupCount=30)

console_handler = logging.StreamHandler()  # 輸出到控制台
file_handler.setLevel('INFO')  # 定義日志等級,這裡INFO以上才輸出到檔案
console_handler.setLevel('INFO')  # 定義日志等級,這裡INFO以上才輸出到控制台

# 定義日志顯示格式
fmt = '[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s'
formatter = logging.Formatter(fmt)
file_handler.setFormatter(formatter)
# filename="mylog" suffix設定,會生成檔案名為mylog.2020-02-25.log
file_handler.suffix = "%Y-%m-%d.log"
# extMatch是編譯好正規表達式,用于比對日志檔案名字尾
# 需要注意的是suffix和extMatch一定要比對的上,如果不比對,過期日志不會被删除。
file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log#34;)
console_handler.setFormatter(formatter)
logger = logging.getLogger(__file__)
logger.setLevel('INFO')

logger.addHandler(file_handler)
logger.addHandler(console_handler)
logger.info('hello,Python logging你好。')           

——END——