优雅的Django旋转日志文件名

3 投票
2 回答
5886 浏览
提问于 2025-04-17 23:18

我正在尝试设置一个日志记录器,每天写入一个新的文件。我希望日志文件的路径是/log/name_YYYY_mm_dd.log,但看起来这个文件名是固定的。

有没有什么好的方法可以让文件名每天都变呢?

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
    'require_debug_false': {
        '()': 'django.utils.log.RequireDebugFalse'
    }
},
'formatters': {
    'verbose': {
        'format': '%(levelname)s|%(asctime)s|%(module)s|%(process)d|%(thread)d|%(message)s',
        'datefmt' : "%d/%b/%Y %H:%M:%S"
    },
},
'handlers': {
    'default': {
        'level': 'INFO',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'filename': os.path.join(ROOT_DIR, 'django_%s.log' % (datetime.now().strftime('%Y-%m-%d-%H-%M'))),
        'formatter': 'verbose',
    },
},
'loggers': {
    'sensible': {
        'handlers': ['default'],
        'level': 'DEBUG',
        'propagate': True,
    },
}

}

2 个回答

1

Django的日志功能其实就是对Python日志模块的一个简单封装,如果需要的话,你可以用它来覆盖Django的设置。

在Python中创建轮转日志

import logging
import time

from logging.handlers import TimedRotatingFileHandler

#----------------------------------------------------------------------
def create_timed_rotating_log(path):
    """"""
    logger = logging.getLogger("Rotating Log")
    logger.setLevel(logging.INFO)

    handler = TimedRotatingFileHandler(path,
                                       when="midnight",
                                       interval=1,
                                       backupCount=5)
    logger.addHandler(handler)

    for i in range(6):
        logger.info("This is a test!")
        time.sleep(75)

#----------------------------------------------------------------------
if __name__ == "__main__":
    log_file = "timed_test.log"
    create_timed_rotating_log(log_file)

绕过Django的日志设置可能还可以避免父日志记录器没有接收到被禁用的子日志记录器的事件

5

你忘记加上 'when': 'midnight',,还有可能需要一个包装器,如果你是从多个实例中记录日志的话。试试这个

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
    'require_debug_false': {
        '()': 'django.utils.log.RequireDebugFalse'
    }
},
'formatters': {
    'verbose': {
        'format': '%(levelname)s|%(asctime)s|%(module)s|%(process)d|%(thread)d|%(message)s',
        'datefmt' : "%d/%b/%Y %H:%M:%S"
    },
},
'handlers': {
    'default': {
        'level': 'INFO',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'filename': os.path.join(ROOT_DIR, 'django.log'),
        'formatter': 'verbose',
        'when': 'midnight',
        'backupCount': '30',
    },
},
'loggers': {
    'sensible': {
        'handlers': ['default'],
        'level': 'DEBUG',
        'propagate': True,
    },
}

系统会通过在文件名后面加上扩展名来保存旧的日志文件。这些扩展名是基于日期和时间的,使用的格式是 %Y-%m-%d_%H-%M-%S,或者其中的一部分,具体取决于你设置的时间间隔。

撰写回答