簡體   English   中英

在python的記錄器中分離stdout和stderr

[英]Separating stdout and stderr in python's logger

我正在使用以下代碼將錯誤/警告與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消息......有什么想法嗎?

在UNIX終端中sys.stdoutsys.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.stderrsys.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM