如何更改Django日志的日期格式?

3pvhb19x  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(105)

答案here中的注解说,你应该能够自定义Django中的日志日期格式:
请注意,如果您使用dictConfig方法配置日志记录(例如如果你使用的是Django),你可以使用格式化程序的dict键'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应该已经被传递并使用,但似乎并非如此:
https://github.com/django/django/blob/782d85b6dfa191e67c0f1d572641d8236c79174c/django/utils/log.py#L190
使用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中的某种bug吗?除非我错了,否则没有办法基于此覆盖此datefmt

zzwlnbp8

zzwlnbp81#

这是一个很好的,详细的调查。确保你的研究包括Django ticket tracker。搜索site:code.djangoproject.com datefmt的第一个结果显示这是一个known bug
该票证显示了一种可能的解决方法-使用asctime而不是server_time

xoefb8l8

xoefb8l82#

一个解决方案是使用属性asctime而不是server_time,例如

'format': '[{asctime}] {message}',`
           'datefmt' : '%Y-%m-%d',`

字符串
我认为server_time是日志记录器'django'使用的修改属性。当我尝试使用server_time化日志记录器'root'的日志消息时,我得到一个错误,指示属性server_time无法识别。

raise ValueError('Formatting field not found in record: %s' % e)
ValueError: Formatting field not found in record: 'server_time'


我认为server_time是从asctime生成并由django logger提供的格式化字符串值,因此它不起作用,请尝试使用datefmt再次修改它。
datefmt可以很好地修改属性asctime

相关问题