Python のLogger を使い、一日おきにログローテーションし、7日までファイルを保持する。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| import logging, logging.handlers
LOGFILE = /path/tp/my/logfile.log
def initlogger(level = logging.DEBUG):
logger = logging.getLogger('my-logger')
logger.setLevel(level)
if not logger.handlers:
handler = logging.handlers.TimedRotatingFileHandler(
LOGFILE, when = 'D', backupCount = 7
)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
initlogger()
|
initlogger を最初に一度呼び、以降は logging.getLogger(‘my-logger’) でlogger オブジェクトを取得してログを書き込んでいく。
getLogger はシングルトンなので、名前(‘my-logger’)が一致すれば同じ構成のlogger オブジェクトを持ってきてくれる。
1
2
3
4
5
6
7
8
| initlogger()
...
logger = logging.getLogger('my-logger')
logger.debug("DEBUG MESSAGE")
logger.info("INFO: " + log)
logger.warning('%s[%d]: %s', str(e), retcode, msg)
|
関数の説明
initlogger は一度呼ぶだけでよいが、何かしらの理由で再度呼び出すとき、上記チェックがあることで同じハンドラーがアタッチされることを防ぐ。
ログが重複して出力される問題は大体同じハンドラーをアタッチしてしまうせい。
1
2
3
| handler = logging.handlers.TimedRotatingFileHandler(
LOGFILE, when = 'D', backupCount = 7
)
|
TimedRotatingFileHandler の when でローテーション実行のタイミングを指定。
デフォルトパラメータ interval が 1 に設定してあるので、‘D’ とすることでハンドラーがアタッチされた時刻から一日おきにローテーションされる。
1
| formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
Formatter でどのようにメッセージが出力されるか設定する。
%(message)s を含めることで自分のメッセージを与えることができる。
実行例:
1
2
| $ logger.debug('debug message')
> 2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
|
参考リンク
Logging HOWTO
import logging
TimedRotatingFileHandler