忘れてしまいがち
- http://docs.python.org/2/howto/logging.html#logging-flow
- http://docs.python.org/3/howto/logging.html#logging-flow
- python2, 3 でフローは同じ
- 3 だと logging.setLogRecordFactory() で LogRecord の生成もフックできるようになってる
- http://docs.python.org/2/howto/logging-cookbook.html#adding-contextual-information-to-your-logging-output
- http://docs.python.org/3/howto/logging-cookbook.html#adding-contextual-information-to-your-logging-output
- webアプリケーションのログにリクエストユーザーの情報を含める等
- LoggerAdapter を使って logger をラップする方法(>= 2.6) と、Filter を作って Logger または Handler に仕掛けておく方法がある
- Filter を使うと、既存のアプリケーションコードに一切変更をせず、また新たなコーディング上のルール等も作らずに、ログに情報を付加できる
- Filter のサブクラスを作って、サイトグローバルな logging設定や WSGIミドルウェアを通じて設定する
- Adapter は特定モジュール/パッケージ内で固有の処理をするときには良さげな感じ
- 予め Adapterでラップした特定の logger インスタンスの使用を義務付けられる範囲で
- もしくは logging.setLoggerClass でLogger じたいを独自のものに置き換えることもできる
- python2 で 3系の logging.setLogRecordFactory() 相当のことをするには Logger を継承して makeRecord() を override するしかないか
- 出力先ファイルパスは一定で、logrotate でローテーションするケース
- logging.handlers.WatchedFileHandler というのがあるのでこれを使う
- 引数は FileHandler と同じ
- logging じたいにも日時やサイズに応じてローテーションさせるハンドラが用意されてはいる (RotatingFileHandler)
- google.appengine.api.app_logging.AppLogsHandler というのがセットされてる
- デプロイ環境だと google3.apphosting.api.app_logging.AppLogsHandler となっている
- 1メッセージあたり 8192 bytes で truncate される
- emit先は GAE のログストレージ