【问题标题】:Elegant rotating logging filename in djangodjango 中优雅的旋转日志文件名
【发布时间】:2014-04-29 02:45:07
【问题描述】:

我正在尝试设置一个每天写入一个新文件的记录器。我想登录到 /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,
    },
}

}

【问题讨论】:

    标签: python django logging


    【解决方案1】:

    如果您从multiple instances 登录,您可能忘记了'when': 'midnight', 并且可能忘记了一个包装器。试试this:

    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,
        },
    }
    

    系统将通过附加扩展名来保存旧的日志文件 文件名。扩展是基于日期和时间的,使用 strftime 格式 %Y-%m-%d_%H-%M-%S 或 a leading portion thereof,取决于 翻转间隔。

    【讨论】:

    • 我们从哪里获得所有这些日志功能,如when 和其他?请提供链接。提前致谢。
    【解决方案2】:

    Django 日志记录只是 Python 日志记录模块的一个薄包装,如果需要,您可以使用它来覆盖 Django 设置。

    Rotating logs in 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 也可以避免 parent loggers not receiving events from disabled children。

    【讨论】:

    • TimedRotatingFileHandler 真的很有帮助!
    猜你喜欢
    • 2015-12-30
    • 2010-12-08
    • 1970-01-01
    • 2013-12-07
    • 2017-05-24
    • 2014-07-23
    • 2021-07-14
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多