禁用根记录器的输出

Tam*_*ren 8 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)
Run Code Online (Sandbox Code Playgroud)

在另一个文件中

import logging
import logger

logger = logging.getLogger(__name__)
logger.info('Staring Scheduler')
Run Code Online (Sandbox Code Playgroud)

我得到以下控制台输出

2014-07-14 22:27:10,915 - __main__                       - INFO     - Staring Scheduler
2014-07-14 22:27:10,915 - __main__                       - INFO     - Staring Scheduler
Run Code Online (Sandbox Code Playgroud)

我无法禁用双输出.我想使用额外的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)
Run Code Online (Sandbox Code Playgroud)

文件 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')
Run Code Online (Sandbox Code Playgroud)

控制台输出:

2014-07-15 09:47:58,171 - __main__                       - ERROR    - Error message
2014-07-15 09:47:58,171 - __main__                       - CRITICAL - Critical message
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Jer*_*len 8

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

一行明确地在这一行:

ch = logging.StreamHandler()
Run Code Online (Sandbox Code Playgroud)

这一行中的另一个:

logging.basicConfig(level=logging.DEBUG,
Run Code Online (Sandbox Code Playgroud)

根据logging.basicConfig的文档:

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

所以你应该删除basicConfig行.

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

logging.getLogger().setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)