python中日誌記録

4604 ワード

一、紹介ここではpythonにおけるログ記録を紹介します。流れのロジックはjavaに似ています。ログ記録には、ロギング(ログレコーダ)、Handler(ログ出力先)、Filter(フィルタ)、Formater(ログ出力フォーマット)、ログレベルなどが含まれている。それぞれ紹介します。二、内容1、ログレベルログのレベルと位相の数値は以下の通りです。CRITICAL=50 FATAL=CRITICAL ERROR=40 WARNING=30 WARN=WARNING INFO=20 DEBUG=10 NOTSET=02、handlerログ出力先を定義します。以下の目的地があります。StreamHandler:出力基準、出力先に出力します。エラー出力FileHandler:ファイルに出力するRotating FileHandler:ファイルサイズでファイリングするTimedRotating FileHandler:ファイルに出力し、タイムファイリングするHTTPHandler:http SMTPHandlerに出力します。メールに出力しません。メソッドはログフォーマットを定義します。    fmt:メッセージフォーマット    datefmt:日付フォーマット    style:デフォルトは%で、書式設定のプレースホルダを指定します。オプション値は'%'、''or''メッセージフォーマットの常用変数は以下の通りです。%(name)s:ログ名%(levelno)s:ログレベル、デジタル形式%(levelname)s:ログレベル%s:ログパス名%d:ログ所在コード行%(asctime)s:カレントタイム%(thread)d:スレッドID%(threadName)s:スレッド名%(process)d:プロセスid%(message)s:メッセージ4、filterフィルタはloging.Filter()によって構成されます。フィルタを生成します。フィルタパラメータはformater変数と似ています。具体的な変数パラメータは、loging.LogRecordクラスの3、例1、jsonフォーマット設定ファイルのloging.jsonを定義します。例は以下の通りです。
{
  "version": 1,
  "disable_existing_loggers": false,
  "formatters": {
    "simple": {
      "format": "%(asctime)s %(name)s [%(levelname)s] %(funcName)s %(message)s"
    }
  },
  "handlers": {
    "streamHandler": {
      "class": "logging.StreamHandler",
      "level": "DEBUG",
      "formatter": "simple",
      "stream": "ext://sys.stdout"
    },
    "timedRotatingFileHandler": {
      "class": "logging.handlers.TimedRotatingFileHandler",
      "level": "DEBUG",
      "formatter": "simple",
      "filename": "../logs/test_log.log",
      "when":"midnight"
    }
  },
  "root": {
    "level": "INFO",
    "handlers": [
      "streamHandler",
      "timedRotatingFileHandler"
    ]
  }
}
2、コードの例
import datetime
import json
import logging.config
import os
from logging.handlers import TimedRotatingFileHandler


#        handler,          
def get_logger(name='all', level='INFO'):
    #      
    log_format = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    #      
    date_format = '%Y-%m-%d %H:%M:%S'

    #        ,        ,        
    # logging.basicConfig(filename="main.log", level=logging.DEBUG, format=log_format, datefmt=date_format)

    #           ,filename:     , when:      , backupCount:      
    handler = TimedRotatingFileHandler(filename="../logs/{}.log".format(name),
                                       when='midnight',
                                       atTime=datetime.time(0, 0, 0, 0),
                                       backupCount=20)
    handler.setFormatter(log_format)
    handler.suffix = '%Y-%m-%d'

    #       
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(log_format)
    test_filter = logging.Filter()

    #    ,        
    test_filter.filter = lambda record: 'test' in record.message
    #    ,        
    # test_filter.filter = lambda record: record.levelno > logging.INFO
    streamHandler.addFilter(test_filter)

    #   logger
    logger = logging.getLogger(name)
    #       
    logger.setLevel(level)
    #   handler
    logger.addHandler(handler)
    logger.addHandler(streamHandler)
    return logger
    pass


#  json         ,  logger
def get_logger_from_json_config(name='all', level='INFO'):
    logger_config_file = '../logging.json'
    if os.path.exists(logger_config_file):
        with open(logger_config_file, encoding='UTF-8') as f:
            cfg = json.load(f)
            logging.config.dictConfig(cfg)

    logger = logging.getLogger(name)
    logger.setLevel(level)
    return logger


def main():
    #         logger
    logger = get_logger('log_study', 'INFO')
    #   json         logger
    # logger = get_logger_from_json_config('log_study_1', 'DEBUG')

    logger.debug("%s log", 'debug')
    logger.info("%s log", 'info')
    logger.warning("%s log", 'warning test')
    logger.error("%s log", 'error')
    logger.fatal("%s log", 'fatal')


if __name__ == '__main__':
    main()
ログ出力例は以下の通りです。2019-01-22 23:17:53,315 INFO info logs 2019-01-22 23:17:53,318 WARNING warning test logs 2019-01-22:17:53,319 ERROR error logs 2019-01-22 23:17:53,319 CRITICAL fatal logs