9

如果整个代码库中都有日志记录语句,我该如何设置记录器,以便在将代码部署到生产环境时不必注释掉对记录器的每个调用?

这是我当前的代码:

import logging


logging.basicConfig(filename='./example.log', level=logging.DEBUG, 
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M')

logging.debug('debug failed')
logging.info('info failed')
logging.warning('A warning')
4

3 回答 3

4

除了使用 之外basicConfig,您还可以根据任何条件使用所需的处理程序更明确地设置记录器。

import logging

log = logging.getLogger("FOO")
log.setLevel(logging.DEBUG)

# needs a handler
log.info('info')
#No handlers could be found for logger "FOO"

ch = logging.StreamHandler()
log.addHandler(ch)
log.info('info')
# info

log.removeHandler(ch)

noop = logging.NullHandler()
log.addHandler(noop)
# nothing happens here
log.info('info')

如果您在调试模式下运行,您可以有一个条件语句来添加您想要的处理程序,或者您可以添加一个NullHandler仅吸收日志消息的处理程序。您还可以单独配置每个处理程序的级别,以便您始终看到警告及以上。除了主记录器之外,每个处理程序都可以有自己的级别。

您可以参考有关如何更具体地使用级别、处理程序和格式的教程。

于 2012-09-18T19:07:11.487 回答
2

这里有几个非常简单的答案。第一种是简单地注释掉basicConfig(...)语句。这将产生不设置任何记录器、处理程序或格式化程序的效果,这意味着您的 debug()、info() 等调用将实际上是无操作的。

另一个简单的答案是将basicConfig()调用中的日志记录级别设置为高于DEBUG. CRITICAL + 1将确保您永远不会看到日志消息。

但是,您提到了将这段代码投入生产的一些事情,所以您可能想要做的是提供-q命令-v行选项(假设这是一个 CLI 工具)。我通常的方法是从WARNING级别开始,每次-q通过增加过滤级别来实现更安静的日志记录。相反,对于每个-v,都朝着更详细的日志记录方向发展。这是一段代码,正是这样做的。

from argparse import ArgumentParser
from logging import basicConfig, CRITICAL, ERROR, WARNING, INFO, DEBUG

parser = ArgumentParser()
parser.add_argument("-v", "--verbose", action="count")
parser.add_argument("-q", "--quiet", action="count")

arguments = parser.parse_args()

raw_log_level = 2 + (arguments.verbose or 0) - (arguments.quiet or 0)
if raw_log_level <= 0: 
    log_level = CRITICAL
elif raw_log_level == 1:
    log_level = ERROR
elif raw_log_level == 2:     # default
    log_level = WARNING
elif raw_log_level == 3: 
    log_level = INFO
else:         
    log_level = DEBUG

basicConfig(level=log_level)
于 2013-12-04T01:16:36.027 回答
1

有记录级别。根据日志记录级别的严重性,它将打印它。

Level   Numeric value
CRITICAL    50
ERROR   40
WARNING     30
INFO    20
DEBUG   10
NOTSET  0

根据日志记录级别,它将打印语句。

您在此处指定的级别是 level=logging.DEBUG。所以除了未设置的日志级别之外的所有日志级别都应该打印出来。如果您只想打印关键级别,请更改 level=logging.CRITICAL

http://docs.python.org/release/2.5/lib/module-logging.html有更多信息

于 2012-09-18T19:05:16.963 回答