繁体   English   中英

python只记录特定级别

[英]python logging specific level only

我正在使用python日志记录模块在我的python代码中记录事件。 我有2个日志文件,我也希望记录,一个包含用户信息,另一个包含更详细的开发日志文件。 我已将两个日志记录文件设置为我想要的级别(usr.log = INFO和dev.log = ERROR),但无法解决如何将日志记录限制为usr.log文件,因此只写入INFO级别日志到日志文件而不是INFO加上其他上面的例如INFO,WARNING,ERROR和CRITICAL。

这基本上是我的代码: -

import logging

logger1 = logging.getLogger('')
logger1.addHandler(logging.FileHandler('/home/tmp/usr.log')
logger1.setLevel(logging.INFO)
logger2 = logging.getLogger('')
logger2.addHandler(logging.FileHandler('/home/tmp/dev.log')
logger2.setLevel(logging.ERROR)

logging.critical('this to be logged in dev.log only')
logging.info('this to be logged to usr.log and dev.log')
logging.warning('this to be logged to dev.log only')

任何帮助都会非常感谢你。

我与大卫达成了一致意见,但我认为还需要说更多。 用公主新娘的话说 - 我不认为这段代码意味着你的意思。 你的代码有:

logger1 = logging.getLogger('')
...
logger2 = logging.getLogger('')

这意味着logger1logger2相同的记录器,因此当您将logger2的级别设置为ERROR时,实际上最终会同时设置logger1的级别。 为了获得两个不同的记录器,您需要提供两个不同的记录器名称。 例如:

logger1 = logging.getLogger('user')
...
logger2 = logging.getLogger('dev')

更糟糕的是,您正在调用日志记录模块的critical()info()warning()方法,并期望两个记录器都将获取消息。 这只能起作用,因为您使用空字符串作为logger1logger2的名称,因此它们不仅是同一个记录器,它们也是根记录器。 如果您按照我的建议对两个记录器使用不同的名称,那么您需要单独调用每个记录器上的critical()info()warning()方法(即,您需要两次调用而不是一次)。

我认为你真正想要的是在一个记录器上有两个不同的处理程序 例如:

import logging

mylogger = logging.getLogger('mylogger')
handler1 = logging.FileHandler('usr.log')
handler1.setLevel(logging.INFO)
mylogger.addHandler(handler1)
handler2 = logging.FileHandler('dev.log')
handler2.setLevel(logging.ERROR)
mylogger.addHandler(handler2)
mylogger.setLevel(logging.INFO)

mylogger.critical('A critical message')
mylogger.info('An info message')

完成此更改后,您可以使用David已经提到过的过滤器 这是一个快速示例过滤器:

class MyFilter(object):
    def __init__(self, level):
        self.__level = level

    def filter(self, logRecord):
        return logRecord.levelno <= self.__level

您可以将过滤器应用于两个处理程序中的每一个,如下所示:

handler1.addFilter(MyFilter(logging.INFO))
...
handler2.addFilter(MyFilter(logging.ERROR))

这将限制每个处理程序仅在指定的级别写出日志消息。

第一:这是一件非常奇怪的事情,并且对我来说只是对日志记录系统的轻微误用。 我无法想象任何情况下,通知用户程序的正常运行,而不是更重要的事情。 记录级别应用于表示重要性; 如果您只有开发人员感兴趣的消息,您应该使用其他一些机制来区分它们(例如您将它们发送到哪个记录器)。

话虽这么说,您可以通过创建一个Filter子类来实现对日志记录的任意过滤,该子类的filter方法实现了您所需的条件并将其安装在适当的处理程序上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM