pythonログ出力(二)-logging出力

4016 ワード

1.共通パラメータ
  • Levelが出力レベルを設定すると、システムはレベルの値がそのレベル以上のログ結果しか出力しません.たとえば、出力ログレベルがINFOに設定されている場合、出力レベルがWARNING、ERRORなどのINFO以上のログは出力されません.DEBUGとNOSETレベルは出力されません.

  • 等級

    CRITICAL
    50
    FATAL
    50
    ERROR
    40
    WARNING
    30
    WARN
    30
    INFO
    20
    DEBUG
    10
    NOTSET
    0
  • Formatter

  • 書式設定
    意味
    %(levelno)s
    ログ・レベルの数値を印刷
    %(levelname)s
    ログ・レベルの名前を印刷します.
    %(filename)s
    現在の実行プログラム名を印刷
    %(pathname)s
    現在の実行プログラムのパスを印刷するのはsysです.argv[0].
    %(funcName)s
    ログの現在の関数の印刷
    %(lineno)d
    ログの現在の行番号を印刷
    %(asctime)s
    ログの印刷時間
    %(thread)d
    スレッドIDの印刷
    %(threadName)s
    スレッド名の印刷
    %(process)d
    印刷プロセスID
    %(processName)s
    印刷プロセス名
    %(module)
    印刷モジュール名
    %(message)s
    ログ情報の印刷
    2.Handlerモード
  • libs\lib\log_test.py
  • import logging
    logger = logging.getLogger('test.log_test')
    def run():
        logger.info('Core Info')
        logger.debug('Core Debug')
        logger.error('Core Error')
    
  • test.py
  • import logging
    from logging.handlers import HTTPHandler
    import sys
    import libs.lib.log_test as log_test
    #initial logger
    logger = logging.getLogger("test")
    logger.setLevel(level=logging.DEBUG)
    # StreamHandler
    stream_handler = logging.StreamHandler(sys.stdout)
    stream_handler.setLevel(level=logging.DEBUG)
    logger.addHandler(stream_handler)
    # FileHandler
    file_handler = logging.FileHandler('output.log')
    file_handler.setLevel(level=logging.INFO)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    # HTTPHandler
    # http_handler = HTTPHandler(host='localhost:8001', url='log', method='POST')
    # logger.addHandler(http_handler)
    # Log
    logger.info('This is a log info')
    logger.debug('Debugging')
    logger.warning('Warning exists')
    logger.info('Finish')
    #catch exception
    try:
        result = 10 / 0
    except Exception:
        logger.error('Faild to get result', exc_info=True)
        logger.exception('Faild to get result', exc_info=True)
    log_test.run()
    

    3.Configモード
  • libs\lib\config.yaml
  • version: 1
    formatters:
     brief:
       format: "%(asctime)s - %(message)s"
     simple:
       format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    handlers:
     console:
       class : logging.StreamHandler
       formatter: brief
       level   : INFO
       stream  : ext://sys.stdout
     file:
       class : logging.FileHandler
       formatter: simple
       level: DEBUG
       filename: debug.log
     error:
       class: logging.handlers.RotatingFileHandler
       level: ERROR
       formatter: simple
       filename: error.log
       maxBytes: 10485760
       backupCount: 20
       encoding: utf8
    loggers:
     main.core:
       level: DEBUG
       handlers: [console, file, error]
    root:
     level: DEBUG
     handlers: [console]
    
  • libs\lib\log_test.py
  • import logging
    logger = logging.getLogger('test.log_test')
    def run():
        logger.info('Core Info')
        logger.debug('Core Debug')
        logger.error('Core Error')
    
  • test.py
  • import logging
    import libs.lib.log_test as log_test
    import yaml
    import logging.config
    import os
    
    def setup_logging(default_path='config.yaml', default_level=logging.INFO):
        path = default_path
        if os.path.exists(path):
            with open(path, 'r', encoding='utf-8') as f:
                config = yaml.load(f)
                logging.config.dictConfig(config)
        else:
            logging.basicConfig(level=default_level)
    
    def log():
        logging.debug('Start')
        logging.info('Exec')
        logging.info('Finished')
    
    if __name__ == '__main__':
        yaml_path = 'E:\python_sample\libs\lib\config.yaml'
        setup_logging(yaml_path)
        log()
        log_test.run()