我希望将具有特定记录器名称、特定级别和更高级别(例如info
和更高级别)的消息记录到特定日志处理程序(例如文件处理程序),同时仍将所有日志消息发送到控制台。Python是2.7版。
到目前为止,我尝试创建了两个记录器:
对于根记录器,我附加了logging.StreamHandler
,并将日志级别设置为logging.debug
。
然后,我将一个处理程序附加到命名记录器,并将该记录器的级别设置为logging.info
。
当我现在调用使用命名记录器的模块时,我不再获得传播到根记录器的debug
日志。
注意:extraLogger在这里有一个StreamHandler来演示这个问题。在我的生产代码中,我会使用一个文件处理程序
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)
实际产出:
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 - 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
我怀疑自定义过滤器
在这种情况下会有帮助,但我不知道如何...
您可以像这样使用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)
import logging
class LevelFilter(logging.Filter):
"""
https://stackoverflow.com/a/7447596/190597 (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)
我使用Kubernetes作为cron作业运行python脚本。问题是,直到作业完成后,我才看到脚本的输出(可能需要一段时间才能运行)。我怀疑这是由于日志记录级别(--v选项)造成的,但在我的整个生命周期中,我都找不到它的文档(默认为--v=0)。如果我想增加输出内容的详细程度,是否有人知道“INFO”或“TRACE”的值(或者这些值是什么/定义在哪里)?提前谢谢你的帮助。 编辑:是否有人在Kub
我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?
在我的Java应用程序中,我使用SLF4J+Logback进行日志记录。我在开发环境中使用调试级日志记录,在生产环境中使用错误级日志记录。但是有一些消息我无论如何都想要记录下来,无论日志级别如何(类似于,但使用的是logger)。 有什么切实可行的方法可以实现这一点吗?我可以使用error或更低的级别,但我想做的是给出一些信息,所以在语义上是错误的,它不是错误。 我可以在我的中为我的类定义另一个记
问题内容: 我正在考虑将Redis用于Web应用程序日志记录目的。我用谷歌搜索,有人将日志转储到Redis队列/列表中,然后将计划的工作人员转储到磁盘中。 http://nosql.mypopescu.com/post/8652869828/another-redis-use-case- centralized-logging 我希望寻求理解,为什么不直接使用Redis持久化到磁盘?如果我分配了一
logging 模块自 2.3 版以来一直是 Python 标准库的一部分。在 PEP 282 中有对它的简洁描述。除了 基础日志教程 之外,这些文档是非常难以阅读的。 日志记录一般有两个目的: 诊断日志 记录与应用程序操作相关的日志。例如,当用户遇到程序报错时, 可通过搜索诊断日志以获得上下文信息。 审计日志 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息, 并结合其他用户资料构成用
SLF4J具有以下日志级别 JDK日志记录具有以下日志级别 如果我想将日志级别设置为DEBUG,那么该级别在JDK日志中不可用。谁能解释一下在这种情况下我们如何获得调试级别的日志记录。对于这种情况,我们需要做什么额外的配置吗? 已更新 这是我的属性文件配置 请让我知道我哪里错了。