禁用根记录器的输出

时间:2014-07-15 05:35:23

标签: python logging

我在名为' logger.py'

的文件中包含以下代码
import logging

format = '%(asctime)s - %(name)-30s - %(levelname)-8s - %(message)s'
logging.basicConfig(level=logging.DEBUG,
                    format=format)

formatter = logging.Formatter(format)

fh = logging.FileHandler('test.log')
fh.setFormatter(formatter)
fh.setLevel(logging.DEBUG)

ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.INFO)

logging.getLogger().addHandler(fh)
logging.getLogger().addHandler(ch)

并在另一个文件中

import logging
import logger

logger = logging.getLogger(__name__)
logger.info('Staring Scheduler')

我正在获得以下控制台输出

2014-07-14 22:27:10,915 - __main__                       - INFO     - Staring Scheduler
2014-07-14 22:27:10,915 - __main__                       - INFO     - Staring Scheduler

我无法禁用双输出。我想使用额外的streamhandler来自定义打印到控制台的日志级别。将来我还想使用RotatingFileHandler而不是简单的文件处理程序。

有没有人知道如何实现这一点,同时保持简单的记录器设置,如第二个文件?我有搜索,但似乎没有解决办法。

更新1(已解决)

档案logger.py

import logging

logging.getLogger().setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)-30s - %(levelname)-8s - %(message)s')

fh = logging.FileHandler('test.log')
fh.setFormatter(formatter)
fh.setLevel(logging.DEBUG)

ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.ERROR)

logging.getLogger().addHandler(fh)
logging.getLogger().addHandler(ch)

档案test.py

import logging
import logger

logger = logging.getLogger(__name__)
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warning message')
logger.error('Error message')
logger.critical('Critical message')

控制台输出:

2014-07-15 09:47:58,171 - __main__                       - ERROR    - Error message
2014-07-15 09:47:58,171 - __main__                       - CRITICAL - Critical message

Test.log内容:

2014-07-15 09:47:58,171 - __main__                       - DEBUG    - Debug message
2014-07-15 09:47:58,171 - __main__                       - INFO     - Info message
2014-07-15 09:47:58,171 - __main__                       - WARNING  - Warning message
2014-07-15 09:47:58,171 - __main__                       - ERROR    - Error message
2014-07-15 09:47:58,171 - __main__                       - CRITICAL - Critical message

3 个答案:

答案 0 :(得分:7)

您看到双输出的原因是您在第一个文件中设置了两个 StreamHandlers; logger.py

在这一行中明确指出:

ch = logging.StreamHandler()

另一行:

logging.basicConfig(level=logging.DEBUG,

根据logging.basicConfig的文档:

  

通过使用默认Formatter创建StreamHandler并将其添加到根记录器来为日志系统执行基本配置。

所以你应该删除basicConfig行。

但是在删除之后,您需要将根记录器的级别设置为DEBUG,因为您在basicConfig行中执行此操作:

logging.getLogger().setLevel(logging.DEBUG)

答案 1 :(得分:1)

所以你可以先删除已经将StreamHandler添加到root syslogger的basicConfig,这样你实际上有两个StreamHandler:

logging.getLogger().addHandler(fh)
logging.getLogger().addHandler(ch)
print logging.getLogger().handlers

[<logging.StreamHandler object at 0x7f3f57c4d050>, <logging.FileHandler object at 0x7f3f57c091d0>, <logging.StreamHandler object at 0x7f3f57c09250>]

然后你必须做basicConfig为你做的事情:

logging.getLogger().setLevel(logging.INFO)

答案 2 :(得分:1)

您正在调用logging.basicConfig(),默认为StreamHandler。相反,您应该手动设置级别。

>>> import logging

>>> format = '%(asctime)s - %(name)-30s - %(levelname)-8s - %(message)s'
>>> formatter = logging.Formatter(format)
>>> fh = logging.FileHandler('test.log')
>>> fh.setFormatter(formatter)
>>> fh.setLevel(logging.DEBUG)
>>> ch = logging.StreamHandler()
>>> ch.setFormatter(formatter)
>>> ch.setLevel(logging.INFO)
>>> logging.getLogger().addHandler(fh)
>>> logging.getLogger().addHandler(ch)
>>> l = logging.getLogger(__name__)
>>> l.setLevel(logging.INFO)
>>> l.info("HI")
2014-07-15 08:46:50,000 - __main__                       - INFO     - HI

文件内容为:

msvalkon@lunkwill:~$ cat test.log
2014-07-15 08:46:50,000 - __main__                       - INFO     - HI

此外,您还要覆盖logger。在another file

import logging
import logger # <-- importing logger.py

logger = logging.getLogger(__name__) # <-- overwriting the logger name, nothing from logger.py is now availabe
logger.info('Staring Scheduler') # This is just a logging object

您的日志记录配置已完成(在本例中为),因为导入将通过您的代码完成。在其他一些情况下可能不是这样。通过更改变量名称或完全更改配置方案进行修复。