tra*_*cki 7 python logging handler python-2.7
我想将特定记录器名称的消息记录INFO到特定的日志处理程序(比如文件处理程序),同时将所有日志消息记录到控制台.Python是2.7版.
我到现在为止尝试创建两个记录器:
对于根记录器,我附加了一个logging.StreamHandler,并将日志级别设置为logging.DEBUG.
然后我将一个处理程序附加到命名记录器并logging.INFO为该记录器设置级别.
当我现在调用我使用命名记录器的模块时,我不再将DEBUG日志传播到根记录器了.
注意:extraLogger 在这里有一个StreamHandler来演示这个问题.在我的生产代码中,我使用了FileHandler
import logging
def do_logging(turn):
logger = logging.getLogger('extra')
logger.info('some info turn %d' % turn)
logger.debug('this is debug fudge turn %d' % turn)
rootLogger = logging.getLogger()
handler = logging.StreamHandler()
rootFormatter = logging.Formatter('root - %(levelname)s: %(msg)s')
handler.setFormatter(rootFormatter)
rootLogger.addHandler(handler)
rootLogger.setLevel(logging.DEBUG)
do_logging(1)
extraLogger = logging.getLogger('extra')
extraHandler = logging.StreamHandler()
extraFormatter = logging.Formatter('extra - %(levelname)s: %(msg)s')
extraHandler.setFormatter(extraFormatter)
extraLogger.addHandler(extraHandler)
extraLogger.setLevel(logging.INFO)
do_logging(2)
Run Code Online (Sandbox Code Playgroud)
实际产量:
root - INFO: some info turn 1
root - DEBUG: this is debug fudge turn 1
extra - INFO: some info turn 2
root - INFO: some info turn 2
Run Code Online (Sandbox Code Playgroud)
我想要的输出:
root - INFO: some info turn 1
root - DEBUG: this is debug fudge turn 1
extra - INFO: some info turn 2
root - INFO: some info turn 2
root - DEBUG: this is debug fudge turn 2
Run Code Online (Sandbox Code Playgroud)
我怀疑Filter在这种情况下定制会有所帮助,但我不知道如何...
\n\n如果此属性的计算结果为 true,则除了附加到此记录器的任何处理程序之外,记录到此记录器的事件还将传递到更高级别(祖先)记录器的处理程序。消息直接传递到祖先记录器 xe2x80x99 处理程序 - 不考虑相关祖先记录器的级别或过滤器。
\n如果其计算结果为 false,则日志消息不会传递到\n祖先记录器的处理程序。
\n
请访问 python 官方网站以获取有关此内容的详细讨论。
\nimport logging\n\nhandler = logging.StreamHandler()\n\nparent = logging.getLogger("parent")\nparent.addHandler(handler)\nchild = logging.getLogger("parent.child")\nchild.propagate = False\n\nchild.setLevel(logging.DEBUG)\nchild.addHandler(handler)\n\nchild.info("HELLO")\nRun Code Online (Sandbox Code Playgroud)\n$ python3.10 propagate.py \nHELLO\nRun Code Online (Sandbox Code Playgroud)\nimport logging\n\nhandler = logging.StreamHandler()\n\nparent = logging.getLogger("parent")\nparent.addHandler(handler)\nchild = logging.getLogger("parent.child")\n#child.propagate = False\n\nchild.setLevel(logging.DEBUG)\nchild.addHandler(handler)\n\n\nchild.info("HELLO")\nRun Code Online (Sandbox Code Playgroud)\n$ python3.10 propagate.py \nHELLO\nHELLO\nRun Code Online (Sandbox Code Playgroud)\n
您可以这样使用robert的LevelFilter:
# Put the Filter on the Handler so only INFO and higher is handled
extraHandler.addFilter(LevelFilter(logging.INFO))
# Let the Logger process everything (so it can propagate records to root)
extraLogger.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
import logging
class LevelFilter(logging.Filter):
"""
/sf/answers/521331751/ (robert)
"""
def __init__(self, level):
self.level = level
def filter(self, record):
return record.levelno >= self.level
def do_logging(turn):
logger = logging.getLogger('extra')
logger.info('some info turn %d' % turn)
logger.debug('this is debug fudge turn %d' % turn)
rootLogger = logging.getLogger()
handler = logging.StreamHandler()
rootFormatter = logging.Formatter('root - %(levelname)s: %(msg)s')
handler.setFormatter(rootFormatter)
rootLogger.addHandler(handler)
rootLogger.setLevel(logging.DEBUG)
do_logging(1)
extraLogger = logging.getLogger('extra')
extraHandler = logging.StreamHandler()
extraFormatter = logging.Formatter('extra - %(levelname)s: %(msg)s')
extraHandler.setFormatter(extraFormatter)
extraLogger.addHandler(extraHandler)
# Put the Filter on the Handler so only INFO and higher is handled
extraHandler.addFilter(LevelFilter(logging.INFO))
# Handle everything (so it can propagate to root)
extraLogger.setLevel(logging.DEBUG)
do_logging(2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11999 次 |
| 最近记录: |