Django日志记录 - 正确输出到stdout和stderr

9 投票
2 回答
4380 浏览
提问于 2025-04-18 09:06

看起来Django的日志记录默认是把所有日志级别的信息输出到标准错误(stderr)上。

比如,当我设置日志记录时是这样的:

'version': 1,
        'disable_existing_loggers': True,
        'formatters': {
            'default': {
                'format': "%(asctime)s:%(name)s:%(levelname)s:%(message)s"
            },
        },
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
                'formatter': 'default',

            }
        },
        'loggers': {
            '': {
                'handlers': ['console'],
                'level': 'DEBUG',
                'propagate': True,
            },
            'django': {
                'handlers': ['console'],
                'level': 'WARNING',
                'propagate': False,
            },
            'appname': {
                'handlers': ['console'],
                'level': 'WARNING',
                'propagate': False,
            },

当我把处理器改成:

 'handlers': {
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
                'formatter': 'default',
                'stream': sys.stdout  #Notice the change
            }
        },

然后所有的输出就变成了标准输出(stdout)。

但我需要的是正确的行为:把信息、调试和警告日志输出到stdout(警告可以随便,没太大关系),而把异常、错误和严重错误输出到stderr

我这里漏掉了什么?(有没有什么明显的设置?大家都知道的?)谢谢大家的帮助!

2 个回答

0

我们应该像文档中那样修正标准流的名称。

"stream": "ext://sys.stdout"

...

https://docs.python.org/3/howto/logging-cookbook.html#custom-handling-of-levels

7

试着定义两个处理程序,比如 consoleoutconsoleerr,每个处理程序都要使用正确的数据流。

loggers 部分中,为每个条目使用合适的处理程序。

撰写回答