根据我的阅读和理解,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)