python中日誌記録
一、紹介ここでは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