JavaScript が無効になっているよ!

Python Loggerを簡単に設定

 ·  ☕ 2 分(読了時間)  ·  🐨 Puliyo

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)

関数の説明

1
if not logger.handlers

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

シェア
支援