Django按日期或小时登录文件

Jer*_*ang 6 django

我知道django可以登录到一个文件,但我想知道如何在diff时间打印到不同的文件.文件名如20150101.log 20150102.log.

两个问题:

  1. 我可以通过LOGGING->filename配置实现吗?
  2. 如果Q1不能,我怎么能动态改变handlers

换句话说,如何使用django分割文件不是通过filesize而是通过datetime.

Noa*_*oah 12

TimedRotatingFileHandler

要根据日期或时间登录到不同的文件,可以使用logging.handlers.TimedRotatingFileHandler类.

TimedRotatingFileHandler所有消息记录到具有您指定名称的文件.在指定的间隔过去之后,它会将当前文件旋转到具有给定名称的文件,并附加日期和时间.

如果您的文件名是myproject.log在每个间隔结束时,它将旋转该文件myproject.log.2015-01-01,然后继续记录当前消息myproject.log.

不幸的是,这个课程的表现并不像你想象的那么好.它不是根据实际日期和时间旋转,而是根据时间间隔旋转.

如果您选择的间隔是1天,并且您恰好在1月1日中午开始运行Django,它将不会在午夜轮换并将所有消息从1月1日放入名为的文件中myproject.log.2015-01-01.相反,它将在1月2日中午(即您开始后1天)的中午轮换.它会将所有消息轮换到名为的文件myproject.log.2015-01-02.因此,此文件将包含1月1日和2日的消息.

如果您希望类基于实际时间运行,那么覆盖该类并专门覆盖调用的方法将是相当简单的shouldRollover.

至少该类将为您提供每日间隔,以便您可以快速找到所需的日志文件.您只需要查看两个文件.

要在Django中进行设置,请执行以下操作:

LOGGING = { 
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },  
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': 'myproject.log',
            'when': 'D', # this specifies the interval
            'interval': 1, # defaults to 1, only necessary for other values 
            'backupCount': 10, # how many backup file to keep, 10 days
            'formatter': 'verbose',
        },

    },  
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        },
        '': {
            'handlers': ['file'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        }
    },  
}
Run Code Online (Sandbox Code Playgroud)

  • 在较新版本的Python中,您可以将"午夜"指定为"何时",它将按预期滚动 (3认同)