Python默认和多级日志记录



根据我的阅读和理解,Python日志记录模块默认会将日志记录到stderr。

如果我运行这个python代码:

import logging

logging.info('test')
logging.warning('test')
logging.error('test')
logging.debug('test')

作为

python main.py 1> stdout.txt 2> stderr.txt

我在stderr.txt中获取日志,而在stdout.txt中什么都没有——我的日志被重定向到stderr。

当日志流式传输到日志聚合服务(如datadog或papertrail(时,这种默认行为是有问题的。由于它是流式传输到stderr的,所以日志被标记为错误,而实际上它们不是。

因此,我尝试创建多个日志处理程序,如下所示:

import logging
import sys

stdoutHandler = logging.StreamHandler(stream=sys.stdout)
stderrHandler = logging.StreamHandler(stream=sys.stderr)
logging.basicConfig(level=logging.DEBUG, handlers=[stdoutHandler, stderrHandler])
stdoutHandler.setLevel(logging.DEBUG)
stderrHandler.setLevel(logging.ERROR)

logging.info('test')
logging.warning('test')
logging.error('test')
logging.debug('test')

当我运行这段代码时,我在sterr.txt中得到了错误,但在stdout.txt中也得到了所有日志——我最终在stderr和stdout流中都出现了日志重复错误日志。

有没有更好的方法来处理Python中错误日志与其他日志的区别?

我也试过loguru包,但在流分离方面也没有运气。。。提前感谢

您可能会从官方文档中描述的方法中受益。

遵循官方文档中描述的方法:https://docs.python.org/3.10/howto/logging-cookbook.html#custom-液位处理

这是我的流分离代码:

import sys
import logging

class StdoutFilter(logging.Filter):
def filter(self, record):
return record.levelno >= ROOT_LEVEL and record.levelno < logging.ERROR

class StderrFilter(logging.Filter):
def filter(self, record):
return record.levelno >= logging.ERROR

stdoutHandler = logging.StreamHandler(stream=sys.stdout)
stdoutHandler.addFilter(StdoutFilter())
stderrHandler = logging.StreamHandler(stream=sys.stderr)
stderrHandler.addFilter(StderrFilter())

root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)
root_logger.addHandler(stderrHandler)
root_logger.addHandler(stdoutHandler)

相关内容

  • 没有找到相关文章

最新更新