Python – logging basicConfig , fileconfig & dictconfig

測試環境為 CentOS 8 x86_64 (虛擬機)

參考文章 – https://docs.python.org/zh-tw/3/howto/logging.html

使用 logging 類別,有以下 6 個物件.

Logger <- Handler <- Formatter
   |        |
   <<<<<<<<<<<<<< Filter 
  1. Logger (紀錄器) – 用來執行日誌紀錄,透過 logging.getLogger(name=None) 來生成 .
  2. 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) 來生成 ,將資料儲存成檔案.
  3. Formatter (格式器) – 顯示訊息的格式, 透過 logging.Formatter(fmt=None, datefmt=None, style=’%’, validate=True, *, defaults=None)來生成, 生成後透過 Handler.setFormatter(fmt) 把 Formatter 加到 Handler .
  4. Filter (過濾器) – 用來控制訊息的輸出內容,看是要加到 logger 或是 Handler ,當你要所有的 Handler 都使用相同的 Filter 時就在 logger 物件透過 logger.addFilter(filter) 來生成 ,想要在個別 Handler 使用時就在 Handler 物件透過 handler.addFilter(filter) 來生成 .
  5. LogRecord – 產生 Logger 時自動生成.
  6. LoggerAdapter – 沒使用過.

來看一下面範例.

  1. 範例 : 使用 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)
    
  2. 範例 : 使用 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')
    
  3. 範例 : 使用 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)
    
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料