時間ごとにログファイルをわける
TimedRotatingFileHandler()を使ってみる。
def init_log():
import time
LOGGING_MSG_FORMAT = LOGFILE_FORMAT
LOGGING_DATE_FORMAT = DATE_FORMAT
logging.basicConfig(
level=logging.DEBUG,
format=LOGGING_MSG_FORMAT,
datefmt=LOGGING_DATE_FORMAT
)
root_logger = logging.getLogger('hoge')
logger = logging.handlers.TimedRotatingFileHandler(LOG_FILENAME,'m',1)
format = logging.Formatter(LOGFILE_FORMAT, DATE_FORMAT)
logger.setFormatter(format)
root_logger.addHandler(logger)
#while True:
#daemon_logger = logging.getLogger('TEST')
#daemon_logger.info("SDFKLDSKLFFJKLSDD")
#time.sleep(60)
return root_logger
da
参考サイト
TimedRotatingFileHandler() isn't rotating at midnight?
同じログが複数回出力される問題
まず、以下のようなログ出力用ファイルlog.cを作ってみた。
# -*- coding: utf-8 -*-$
import os$
import logging$
import logging.handlers$
$
MAX_BYTES = 1024 * 10 * 1000$
BACKUP_COUNT = 4$
LOGFILE_FORMAT = "[%(asctime)s %(process)d] %(levelname)s " \$
"(%(funcName)s: %(module)s:%(lineno)d) %(message)s"$
DATE_FORMAT = "%Y-%m-%d %H:%M:%S"$
LOG_FILENAME = '/var/django/log/django_log.log'$
$
$
def init_log():$
#print 'init_log start'$
$
logger = logging.getLogger("hoge")$
logger.setLevel(logging.DEBUG)$
#handler = logging.handlers.RotatingFileHandler($
# os.path.join(os.path.abspath(os.path.dirname(__file__)),$
# "pkg.log"),$
# maxBytes=MAX_BYTES, backupCount=BACKUP_COUNT)$
handler = logging.handlers.RotatingFileHandler($
LOG_FILENAME,$
maxBytes=MAX_BYTES,$
backupCount=BACKUP_COUNT$
)$
$
format = logging.Formatter(LOGFILE_FORMAT, DATE_FORMAT) $
handler.setFormatter(format)$
handler.setLevel(logging.DEBUG)$
$
#logger.propagate = 0$
$
# only add our default handler if there isn't already one there$
# this avoids annoying duplicate log messages.$
#if handler not in logger.handlers:$
logger.addHandler(handler)$
$
# default level$
#logger.setLevel(logging.WARNING)$
return logger$
$
$
init_log()$
これをsettings.pyで呼び出す。
LOGGER = init_log()
すると、同じログが4回吐かれる。
下記の参考サイトによると、settingsが複数回よばれている可能性があるそうだ。
対策1:
フラグで対応
def init_logging():$
stdoutHandler = logging.StreamHandler( sys.stdout )$
stdoutHandler.setLevel( DEBUG )$
stdoutHandler.setFormatter( logging.Formatter( LOG_FORMAT_WITH_TIME ) )$
logging.getLogger( LOG_AREA1 ).addHandler( stdoutHandler )$
$
logInitDone=False$
if not logInitDone:$
logInitDone = True$
init_logging()$
対策2:
これもフラグで対応
if not hasattr(logging, "set_up_done"):$
logging.set_up_done=False$
$
def set_up(myhome):$
if logging.set_up_done:$
return$
# set up your logging here$
# ...$
logging.set_up_done=True
対策3:
インスタンスがあるかないかで判定
def init_logging():$
stdoutHandler = logging.StreamHandler( sys.stdout )$
stdoutHandler.setLevel( DEBUG )$
stdoutHandler.setFormatter( logging.Formatter( LOG_FORMAT_WITH_TIME ) )$
logger = logging.getLogger( LOG_AREA1 )$
if len(logger.handlers) < 1:$
logger.addHandler( stdoutHandler )
上記対策を試してみる。
参考サイト