Python でログ出力を行いログ管理することが本当に必要なのか甚だ疑問ではあるが、
開発でデバッグで使いたい場合もあるだろう。。
以前、ログ出力管理設定の ini ファイル形式を使用するサンプルを書いた。
→ Python ロギング日付ローテーションのスニペット - Oboe吹きプログラマの黙示録
設定ファイルを置くことがどうも、ナンセンスのような気がして、
iniファイルを使用しない方法で、
改めて、以下の logger.py を用意する。
注意:設定ファイルを用意しない代わりに、ログ出力先ファイル名は、
このログクラスインスタンス内で決定する。
logger.py
# -*- coding: UTF-8 -*- from logging import Formatter, handlers, StreamHandler, getLogger, DEBUG, WARN import inspect class Logger: def __init__(self, name=__name__): if name=="logger": name = inspect.getmodule(inspect.stack()[1][0]).__name__ self.logger = getLogger(name) self.logger.setLevel(DEBUG) formatter = Formatter(fmt="%(asctime)s.%(msecs)03d %(levelname)7s %(message)s [%(name)s %(processName)s - %(threadName)s]", datefmt="%Y/%m/%d %H:%M:%S") ### WARN レベルまで標準出力する ### sthandler = StreamHandler() sthandler.setLevel(WARN) sthandler.setFormatter(formatter) self.logger.addHandler(sthandler) ### 時刻ローテーション ### handler = handlers.TimedRotatingFileHandler(filename='/var/log/test.log', encoding='UTF-8', when='D', backupCount=7 ) ### サイズローテーション ### ''' handler = handlers.RotatingFileHandler(filename='/var/log/test.log', encoding='UTF-8', maxBytes=1048576, backupCount=3) ''' ############################ handler.setLevel(DEBUG) handler.setFormatter(formatter) self.logger.addHandler(handler) def debug(self, msg): self.logger.debug(msg) def info(self, msg): self.logger.info(msg) def warn(self, msg): self.logger.warning(msg) def error(self, msg): self.logger.error(msg) def critical(self, msg): self.logger.critical(msg)
ログの書式は、Formatter で指定している。
テスト実行は、よくコンソールで実行することが多いので
あえて、エラーや警告出力を、標準出力するようにハンドラ sthandler を
セットしている。
本番稼働時などは、この sthandler 設定など不要であろう。
また、ログ出力元の名称としてインスタンス生成で渡す name が省略された時、
多くは、 Logger() とそのまま書いてしまうコードが多いであろうとして、
inspect モジュールでスタックトレースから
呼出し元を探してモジュール名を、ログ出力するようにしている、
使い方
from logger import Logger logger = Logger("aaa") logger.debug("■ %s" % "test_あ")
Logger インスタンス引数を省略すれば、
logger = Logger()
Formatter で指定した
[%(name)s %(processName)s - %(threadName)s]
の %(name)s は、Logger インスタンス生成元のモジュール名、__main__ などになる。
設定ファイル ini で管理するにしても、設定ファイルを用意しない方法にしても、
どちらも開発製造テストから、本番稼働では、手入れが必要な筈で
どちらが良いか悩ましい。
以下で、書き直した!!!
Python ログ、標準の logging - Oboe吹きプログラマの黙示録