Python日志记录在stdout和stderr之间分割

cro*_*red 18 python logging stderr

是否有可能将INFO或DEBUG的python日志消息转到stdout,使用WARNING或更高版本转到stderr?

cro*_*red 42

这似乎做我想要的:

    #!/usr/bin/python
    import sys
    import logging

    class InfoFilter(logging.Filter):
        def filter(self, rec):
            return rec.levelno in (logging.DEBUG, logging.INFO)

    logger = logging.getLogger('__name__')
    logger.setLevel(logging.DEBUG)

    h1 = logging.StreamHandler(sys.stdout)
    h1.setLevel(logging.DEBUG)
    h1.addFilter(InfoFilter())
    h2 = logging.StreamHandler()
    h2.setLevel(logging.WARNING)

    logger.addHandler(h1)
    logger.addHandler(h2)
Run Code Online (Sandbox Code Playgroud)

  • 实际上不需要创建过滤器类.你也可以传递一个可调用的:`h1.addFilter(lambda record:record.levelno <= logging.INFO)` (10认同)
  • 通常,您可以使用“logger =logging.getLogger(__name__)”(不带引号)来使用模块的名称。 (2认同)

E.Z*_*.Z. -2

我认为这会有所帮助:Handler.setLevel(lvl)

将此处理程序的阈值设置为lvl。低于lvl 严重程度的日志消息将被忽略。创建处理程序时,级别设置为 NOTSET(这会导致处理所有消息)。

但现在我发现它不会做你想要的事情(将信息/调试与警告/错误分开)

logging.StreamHandler话虽这么说,您可以编写一个自定义处理程序(例如扩展的类),并覆盖该Handler.handle()方法。