Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅python日志记录特定级别_Python - Fatal编程技术网

仅python日志记录特定级别

仅python日志记录特定级别,python,Python,我使用python日志模块在python代码中记录事件。我有两个日志文件我也想记录,一个包含用户信息,另一个更详细的日志文件供开发人员使用。我已经将这两个日志文件设置为我想要的级别(usr.log=INFO和dev.log=ERROR),但无法确定如何将日志限制为usr.log文件,因此只将信息级别的日志写入日志文件,而不是信息加上上面的所有内容,例如信息、警告、错误和严重信息 这基本上是我的代码:- import logging logger1 = logging.getLogger('')

我使用python日志模块在python代码中记录事件。我有两个日志文件我也想记录,一个包含用户信息,另一个更详细的日志文件供开发人员使用。我已经将这两个日志文件设置为我想要的级别(usr.log=INFO和dev.log=ERROR),但无法确定如何将日志限制为usr.log文件,因此只将信息级别的日志写入日志文件,而不是信息加上上面的所有内容,例如信息、警告、错误和严重信息

这基本上是我的代码:-

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')

任何帮助都将非常感谢。

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


也就是说,您可以通过创建一个子类来实现对日志记录的任意筛选,该子类的
filter
方法实现您所需的条件,并将其安装到相应的处理程序上。

我大体上同意David的观点,但我认为还需要说更多。换言之,我不认为这段代码意味着你认为它意味着什么。您的代码有:

logger1 = logging.getLogger('')
...
logger2 = logging.getLogger('')
这意味着
logger1
logger2
是同一个记录器,因此当您将
logger2
的级别设置为ERROR时,实际上会同时设置
logger1
的级别。为了获得两个不同的记录器,您需要提供两个不同的记录器名称。例如:

logger1 = logging.getLogger('user')
...
logger2 = logging.getLogger('dev')
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')
更糟糕的是,您正在调用日志模块的
critical()
info()
warning()
方法,并期望两个记录器都能获得消息。这仅仅是因为您使用空字符串作为
logger1
logger2
的名称,因此它们不仅是同一个记录器,还是根记录器。如果您按照我的建议为两个记录器使用不同的名称,那么您需要分别调用每个记录器上的
critical()
info()
warning()
方法(即,您需要两个调用,而不是一个)

我认为您真正想要的是在一个记录器上有两个不同的记录器。例如:

logger1 = logging.getLogger('user')
...
logger2 = logging.getLogger('dev')
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

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

@srgerg感谢您花时间解释它,这现在更有意义了。要仅在指定的级别上发出日志,条件不需要是
logRecord.levelno==self.\uu level
而不是
Oh,我想另一个内置过滤器将进行
=
比较。@samstav确实如此,但为了代码清晰,我认为如果这是您的意思,使用
=
仍然很有用。一个例子是,如果您设置了独立的日志流处理程序。您可以设置一个日志记录任何重要的内容并将其发送到stderr。然后,您可以将一个完全独立的StreamHandler设置为warning或lower,并将其设置为stdout。您不希望重复记录关键事件,也不希望它们出现在标准输出中。这就是过滤器的用途,这是一个非常合法的用例。我有一个脚本,可以定期捕获非关键错误和警告,并将其记录到文件中,然后继续执行。但是,如果最终用户在屏幕上看到这些,他会翻转并告诉我脚本已损坏。因此,对我来说,只将信息级别的消息记录到屏幕上,而将所有其他级别的消息记录到文件中是非常合理的。@Aaronduniganatele在这种情况下,对我来说有意义的是只向用户显示用户可以看到的消息。这些可以(而且,我认为,应该)由发出它们的记录器识别,而不是由级别识别。