【发布时间】:2015-11-30 02:41:26
【问题描述】:
我知道 django 可以登录到一个文件,但我想知道如何在不同的时间打印到不同的文件。文件名如20150101.log20150102.log。
两个问题:
- 我可以通过
LOGGING->filenameconfig 来实现吗? - 如果Q1不能,如何动态更改
handlers?
换句话说,我怎样才能使 django 拆分文件不是按文件大小而是按日期时间。
【问题讨论】:
标签: django
我知道 django 可以登录到一个文件,但我想知道如何在不同的时间打印到不同的文件。文件名如20150101.log20150102.log。
两个问题:
LOGGING->filename config 来实现吗? handlers?换句话说,我怎样才能使 django 拆分文件不是按文件大小而是按日期时间。
【问题讨论】:
标签: django
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'),
}
},
}
【讨论】:
logging.handlers.TimedRotatingFileHandler 文件处理程序无法在多进程(请求持续到来的 Web 应用程序)中按预期工作。在轮换时,它会截断日志。请建议哪些适用于 Web 应用程序