2

我正在尝试为 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 的默认格式,以便日志消息在整个项目中保持一致?

4

3 回答 3

0

我想你忘了使用你的格式化程序:

'handlers': {
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'filters': ['set_sessid'],
        'formatter': 'request', // this
    },
},
于 2013-03-01T10:42:51.037 回答
0

似乎这些行不是由我的应用程序记录的,而是由manage.py runserver服务器记录的。所以没有办法格式化它们,而是将应用程序日志记录到一些文件中。这将从应用程序日志中完全删除这些行,但这没关系,因为它们不属于那里:)

于 2013-03-06T08:54:44.563 回答
0

覆盖对我有用的默认日志格式。需要停止传播。

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 !!!
        }
    }
}
于 2020-11-24T13:57:56.613 回答