设置日志记录级别

时间:2016-07-23 03:38:29

标签: python logging

我试图使用标准库来调试我的代码:

这很好用:

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('message')

我无法让较低级别的记录器工作:

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.info('message')

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.debug('message')

我都没有得到任何答复。

4 个答案:

答案 0 :(得分:31)

什么是Python版本?这在3.4中为我工作。但请注意basicConfig()如果已经设置了根管理器,则不会影响它:

  

如果根记录器已经为其配置了处理程序,则此函数不执行任何操作。

要明确地在root上设置级别,请执行logging.getLogger().setLevel(logging.DEBUG)。但请确保您事先调用basicConfig(),以便根记录器最初具有一些设置。即:

import logging
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
logging.getLogger('foo').debug('bah')
logging.getLogger().setLevel(logging.INFO)
logging.getLogger('foo').debug('bah')

另请注意" Loggers"和他们的"处理程序"两者都有不同的独立日志级别。因此,如果您以前在Python脚本中明确加载了一些复杂的记录器配置,并且已经与根记录器的处理程序混乱,那么这可能会产生影响,并且只是更改记录器日志级别使用logging.getLogger().setLevel(..)可能无效。这是因为附加的处理程序可能具有独立设置的日志级别。这种情况不太可能发生,而且通常不必担心。

答案 1 :(得分:6)

我使用以下设置进行记录

基于Yaml的配置

像这样

创建一个名为 logging.yml 的yaml文件
version: 1

formatters:
    simple:
        format: "%(name)s - %(lineno)d -  %(message)s"

    complex:
        format: "%(asctime)s - %(name)s - %(lineno)d -  %(message)s"


handlers:
    console:
        class: logging.StreamHandler
        level: DEBUG
        formatter: simple

    file:
        class: logging.handlers.TimedRotatingFileHandler
        when: midnight
        backupCount: 5
        level: DEBUG
        formatter: simple
        filename : Thrift.log

loggers:

    qsoWidget:
        level: INFO
        handlers: [console,file]
        propagate: yes

    __main__:   
        level: DEBUG
        handlers: [console]
        propagate: yes

Python - 主要

“main”模块应如下所示

import logging.config
import logging

with open('logging.yaml','rt') as f:
        config=yaml.safe_load(f.read())
        f.close()
logging.config.dictConfig(config)
logger=logging.getLogger(__name__)
logger.info("Contest is starting")

子模块/类

这些应该像这样开始

import logging

class locator(object):
    def __init__(self):
        self.logger = logging.getLogger(__name__)
        self.logger.debug('{} initialized')

希望能帮到你......

答案 2 :(得分:2)

在我看来,这是大多数情况下的最佳方法。

通过 INI 文件配置

在项目根目录下创建一个文件名logging.ini如下:

[loggers]
keys=root

[logger_root]
level=DEBUG
handlers=screen,file

[formatters]
keys=simple,verbose

[formatter_simple]
format=%(asctime)s [%(levelname)s] %(name)s: %(message)s

[formatter_verbose]
format=[%(asctime)s] %(levelname)s [%(filename)s %(name)s %(funcName)s (%(lineno)d)]: %(message)s

[handlers]
keys=file,screen

[handler_file]
class=handlers.TimedRotatingFileHandler
interval=midnight
backupCount=5
formatter=verbose
level=WARNING
args=('debug.log',)

[handler_screen]
class=StreamHandler
formatter=simple
level=DEBUG
args=(sys.stdout,)

然后配置如下:

import logging

from logging.config import fileConfig

fileConfig('logging.ini')
logger = logging.getLogger('dev')


name = "stackoverflow"

logger.info(f"Hello {name}!")
logger.critical('This message should go to the log file.')
logger.error('So should this.')
logger.warning('And this, too.')
logger.debug('Bye!')

如果您运行脚本,sysout 将是:

2021-01-31 03:40:10,241 [INFO] dev: Hello stackoverflow!
2021-01-31 03:40:10,242 [CRITICAL] dev: This message should go to the log file.
2021-01-31 03:40:10,243 [ERROR] dev: So should this.
2021-01-31 03:40:10,243 [WARNING] dev: And this, too.
2021-01-31 03:40:10,243 [DEBUG] dev: Bye!

并且 debug.log 文件应包含:

[2021-01-31 03:40:10,242] CRITICAL [my_loger.py dev <module> (12)]: This message should go to the log file.
[2021-01-31 03:40:10,243] ERROR [my_loger.py dev <module> (13)]: So should this.
[2021-01-31 03:40:10,243] WARNING [my_loger.py dev <module> (14)]: And this, too.

大功告成。

答案 3 :(得分:0)

我想将默认记录器保留在警告级别,但我的代码有详细的低级别记录器。但它不会显示任何东西。基于另一个答案,预先运行 logging.basicConfig() 至关重要。

import logging
logging.basicConfig()
logging.getLogger('foo').setLevel(logging.INFO)
logging.getLogger('foo').info('info')
logging.getLogger('foo').debug('info')
logging.getLogger('foo').setLevel(logging.DEBUG)
logging.getLogger('foo').info('info')
logging.getLogger('foo').debug('debug')

预期输出

INFO:foo:info
INFO:foo:info
DEBUG:foo:debug

对于跨模块的日志记录解决方案,我这样做了

# cfg.py

import logging
logging.basicConfig()
logger = logging.getLogger('foo')
logger.setLevel(logging.INFO)
logger.info(f'active')

# main.py

import cfg
cfg.logger.info(f'main')