我正在使用以下代码将错误/警告与info / debug消息分开:
import sys, logging
class StdErrFilter(logging.Filter):
def filter(self, rec):
return rec.levelno in (logging.ERROR, logging.WARNING)
class StdOutFilter(logging.Filter):
def filter(self, rec):
return rec.levelno in (logging.DEBUG, logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(process)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s')
h1 = logging.StreamHandler(sys.stdout)
h1.setLevel(logging.DEBUG)
h1.setFormatter(formatter)
h1.addFilter(StdOutFilter())
logger.addHandler(h1)
h2 = logging.StreamHandler(sys.stderr)
h2.setLevel(logging.WARNING)
h2.setFormatter(formatter)
h2.addFilter(StdErrFilter())
logger.addHandler(h2)
不幸的是,看起来过滤器被忽略了。这两个文件都包含INFO / DEBUG消息......有什么想法吗?
答案 0 :(得分:0)
在UNIX终端sys.stdout
和sys.stderr
是相同的,这意味着如果你运行这个脚本,你会得到这个:
(venv) python a.py
5798 - 2017-05-10 - __main__ - DEBUG - A DEBUG message
5798 - 2017-05-10 - __main__ - INFO - An INFO message
5798 - 2017-05-10 - __main__ - WARNING - A WARNING message
5798 - 2017-05-10 - __main__ - ERROR - An ERROR message
事实上,您可能需要通过运行此命令将sys.stderr
和sys.stdout
重定向到不同的文件,您会发现它们实际上是分开的:
(venv) ➜ python a.py 2>> error 1>> info
(venv) cat error
5895 - 2017-05-10 - __main__ - WARNING - A WARNING message
5895 - 2017-05-10 - __main__ - ERROR - An ERROR message
(venv) cat info
5895 - 2017-05-10 - __main__ - DEBUG - A DEBUG message
5895 - 2017-05-10 - __main__ - INFO - An INFO message