答案here中的注释表明您应该能够自定义日期格式以登录Django:
请注意,如果您使用的是dictConfig方法来配置日志记录(例如,如果您使用的是Django),则可以使用格式化程序的“ datefmt”字典键进行设置。请参阅:Django日志记录配置,日志记录模块:字典架构详细信息
但是,它不起作用:
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'django.server': { # duplicate of default for django.server
'()': 'django.utils.log.ServerFormatter',
'format': '[{server_time}] {message}',
'style': '{',
'datefmt' : '%Y-%m-%d %H:%M:%S'
}
}
这也不起作用:
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default': {
'datefmt' : '%Y-%m-%d %H:%M:%S'
},
}
在两种情况下,我仍然会获得默认的日志记录日期格式:
[13/Mar/2019 21:53:05] "GET / HTTP/1.1" 200 16808
请注意,在源代码中,datefmt
应该已经传递并使用了,但事实并非如此:
使用Python 3.6和Django 2.1
更新:
当我如上所述将其包含在settings.py
中时
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[{server_time}] {message}',
'datefmt' : '%Y-%m-%d %H:%M:%S',
'style': '{',
}
}
然后像这样编辑文件conda//lib/python3.6/site-packages/django/utils/log.py
:
class ServerFormatter(logging.Formatter):
def __init__(self, *args, **kwargs):
self.style = color_style()
super().__init__(*args, **kwargs)
print("self.datefmt", self.datefmt)
我在控制台中收到如下消息,表明我实际上在正确传播datefmt
:
$ python manage.py runserver
self.datefmt %Y-%m-%d %H:%M:%S
self.datefmt %Y-%m-%d %H:%M:%S
Performing system checks...
System check identified no issues (0 silenced).
March 13, 2019 - 23:43:50
Django version 2.1.2, using settings 'webapp.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[13/Mar/2019 23:45:14] "GET / HTTP/1.1" 200 16808
也许错误与django/utils/log.py
中的这一行有关?
if self.uses_server_time() and not hasattr(record, 'server_time'):
record.server_time = self.formatTime(record, self.datefmt)
^不管我做什么,看来该检查永远不会失败,因为not hasattr(record, 'server_time')
总是求值为False
,因为record
默认已经有server_time
,它似乎来自django/core/servers/basehttp.py
中Django代码的这一部分:
class WSGIRequestHandler(simple_server.WSGIRequestHandler):
...
...
def log_message(self, format, *args):
extra = {
'request': self.request,
'server_time': self.log_date_time_string(),
}
simple_server.WSGIRequestHandler.log_date_time_string()
来自wsgiref
软件包。但是,该软件包不包含对函数log_date_time_string()
的任何引用,它似乎直接来自Python内置的http
库(conda//lib/python3.6/http/server.py
):
def log_date_time_string(self):
"""Return the current time formatted for logging."""
now = time.time()
year, month, day, hh, mm, ss, x, y, z = time.localtime(now)
s = "%02d/%3s/%04d %02d:%02d:%02d" % (
day, self.monthname[month], year, hh, mm, ss)
return s
^此处的日期格式被硬编码到库中,似乎不可更改。
那么...这应该怎么工作?我想念什么吗?这是Django中的某种错误吗?除非我没有记错,否则无法基于此方法来覆盖此datefmt
吗?
答案 0 :(得分:1)
那是一个很好的详细调查。确保您的研究包括Django票务跟踪器。搜索site:code.djangoproject.com datefmt
的第一个匹配项表明这是known bug。
该票证显示了一种可能的解决方法-使用asctime
而不是server_time
。