Django 自定义日志格式一致性

3 投票
3 回答
3130 浏览
提问于 2025-04-17 17:33

我正在尝试为Django配置日志记录,希望每条日志中都能包含session_key(如果设置了的话)。我觉得我找到了一个方法:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'request': {
            'format': '%(asctime)s %(levelname)-8s [%(sessid)s] %(message)s',
        },
    },
    'filters': {
        'request': {
            '()': 'yellowballs.yblogging.RequestFilter'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'filters': ['request'],
            'formatter': 'request',
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

过滤器是这样定义的:

class RequestFilter(logging.Filter):
    def filter(self, record):
        session_store = SessionStore()
        record.sessid = session_store.session_key
        return True

看起来效果不错,但Django的日志消息还是用它默认的格式记录:

2013-03-01 08:44:41,359 WARNING  [None] Not Found: /
[01/Mar/2013 08:44:41] "GET / HTTP/1.1" 200 1962

我该怎么做才能让像[01/Mar/2013 08:44:41] "GET / HTTP/1.1" 200 1962这样的日志行显示成和其他日志一样的格式呢?

有没有简单好看的方法可以覆盖Django的默认格式,让整个项目的日志消息保持一致?

3 个回答

0

我觉得你忘记用了格式化工具:

'handlers': {
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'filters': ['set_sessid'],
        'formatter': 'request', // this
    },
},
2

覆盖默认的日志格式对我来说有效。这样做是必要的,可以阻止信息的传播。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        "verbose": {
            "format": (
                "%(levelname)s %(name)s %(message)s [PID:%(process)d:%(threadName)s]"
            )
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'django.server': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False, ### NOTE HERE !!!
        }
    }
}
0

看起来这些日志不是我的应用程序记录的,而是由 manage.py runserver 这个服务器记录的。所以我们没法对它们进行格式化。如果把应用程序的日志记录到一些文件里,就可以完全把这些日志去掉,不过这样也没关系,因为它们本来就不应该出现在这里 :)

撰写回答