測試環境為 CentOS 8 x86_64 (虛擬機)
參考文章 – https://docs.python.org/zh-tw/3/howto/logging.html
使用 logging 類別,有以下 6 個物件.
Logger <- Handler <- Formatter | | <<<<<<<<<<<<<< Filter
- Logger (紀錄器) – 用來執行日誌紀錄,透過 logging.getLogger(name=None) 來生成 .
- Handler (處理器) – 選擇日誌的輸出地方,常用的 Handler ,生成後透過 logger.addHandler(hdlr) 把 Handler 加到 Logger .
- StreamHandler – 透過 logging.StreamHandler(stream=None) 來生成, 將資料輸出到標準輸出 sys.stdout, sys.stderr 或是 file-like object .
- FileHandler – 透過 logging.FileHandler(filename, mode=’a’, encoding=None, delay=False, errors=None) 來生成 ,將資料儲存成檔案.
- Formatter (格式器) – 顯示訊息的格式, 透過 logging.Formatter(fmt=None, datefmt=None, style=’%’, validate=True, *, defaults=None)來生成, 生成後透過 Handler.setFormatter(fmt) 把 Formatter 加到 Handler .
- Filter (過濾器) – 用來控制訊息的輸出內容,看是要加到 logger 或是 Handler ,當你要所有的 Handler 都使用相同的 Filter 時就在 logger 物件透過 logger.addFilter(filter) 來生成 ,想要在個別 Handler 使用時就在 Handler 物件透過 handler.addFilter(filter) 來生成 .
- LogRecord – 產生 Logger 時自動生成.
- LoggerAdapter – 沒使用過.
來看一下面範例.
- 範例 : 使用 logging.basicConfig
[root@localhost ~]# vi mylib.py import logging def do_something(): logging.info('Doing something')
[root@localhost ~]# vi myapp.py import logging import mylib def main(): logging.basicConfig(filename='myapp.log', level=logging.INFO) logging.info('Started') mylib.do_something() logging.info('Finished') if __name__ == '__main__': main()
執行結果
[root@localhost ~]# python3 myapp.py
[root@localhost ~]# cat myapp.log INFO:root:Started INFO:root:Doing something INFO:root:Finished
說明:
主要是下面這一行程式,我們透過 logging.basicConfig 來將資料導向到 myapp.log 定設定紀錄的 Level 為 Info 以上(等級: NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL) .logging.basicConfig(filename='myapp.log', level=logging.INFO)
- 範例 : 使用 logging.config.fileConfig
[root@localhost ~]# vi fileConfig.py import logging import logging.config logging.config.fileConfig('logging.conf') # create logger logger = logging.getLogger('simpleExample') # 'application' code logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message')
[root@localhost ~]# vi logging.conf [loggers] keys=root,simpleExample [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
執行結果
[root@localhost ~]# python3 fileConfig.py 2022-05-26 23:47:56,546 - simpleExample - DEBUG - debug message 2022-05-26 23:47:56,546 - simpleExample - INFO - info message 2022-05-26 23:47:56,546 - simpleExample - WARNING - warn message 2022-05-26 23:47:56,546 - simpleExample - ERROR - error message 2022-05-26 23:47:56,546 - simpleExample - CRITICAL - critical message
說明:
主要是下面這一行程式,我們透過 logging.config.fileConfig 用檔案 logging.conf 來指定相關資料的顯示方式.logging.config.fileConfig('logging.conf')
- 範例 : 使用 logging.config.dictConfig
參考範例 – https://rollbar.com/blog/logging-in-python/[root@localhost ~]# vi dictConfig.py import logging.config MY_LOGGING_CONFIG = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'default_formatter': { 'format': '[%(levelname)s:%(asctime)s] %(message)s' }, }, 'handlers': { 'stream_handler': { 'class': 'logging.StreamHandler', 'formatter': 'default_formatter', }, }, 'loggers': { 'mylogger': { 'handlers': ['stream_handler'], 'level': 'INFO', 'propagate': True } } } logging.config.dictConfig(MY_LOGGING_CONFIG) logger = logging.getLogger('mylogger') logger.info('info log')
執行結果
[root@localhost ~]# python3 dictConfig.py [INFO:2022-05-27 00:46:29,033] info log
說明:
主要是下面這一行程式,我們使用 dict 資料型態物件 透過 logging.config.dictConfig 來設定.logging.config.dictConfig(MY_LOGGING_CONFIG)
沒有解決問題,試試搜尋本站其他內容