長期にわたって動かすプログラムを運用する際ログは重要です。ログがないと何が起こったかもさっぱりわからず想定しない動作の対応もとても困難です。そんなわけでログを作るわけですが、ただファイルに記録を書きだすだけならログ機能なんて使わず、ファイルの書き込み機能だけで十分です。Pythonのログ機能にはログを書きこむ際にあらかじめ用意された変数の様なものがあり、それを用いることで労せず情報の濃いログを作れます。
やることはログフォーマットの指定です。一度書きだされるログの形式を定めます。フォーマットは次のようにロガーに渡します。
# グローバルなロガーで定義するならこれ FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s' logging.basicConfig(format=FORMAT) # 個別にロガーを作るならこれ logger = logging.getLogger(__name__) handler = logging.FileHandler(filename='%s/log/debug-%s.log' % ( os.path.dirname(os.path.abspath(__file__)), dt.now().date() )) handler.setFormatter(logging.Formatter(FORMAT)) logger.addHandler(handler)
上の様に好きな文字列をフォーマットとしてロガーに渡せます。この時のasctimeやmessageの様な%()sとprintf的に定義されている部分にログ書き込み時の状況に応じた値が書き込まれます。変数はLogRecord 属性として次の部分にまとめられています。
logging — Python 用ロギング機能 — Python 3.8.0 ドキュメント #LogRecord 属性
多くの人が凝ったロギング機能をGitHubやpypiで公開してくれていますが、どうにも必要な分が足りない時には自作する必要が出てきます。大体、スレッドやプロセスの分岐とどこからどこまでが一連の流れか、一連の流れであることをどう示すか、外部サービスとの連携ログはどうするか、とシステムに特化した部分を考え出すようになると自作した方がお得です。