如何关闭日志语句而不从代码中删除它们

时间:2012-09-18 18:49:54

标签: python logging xdebug

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

这是我目前的代码:

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

3 个答案:

答案 0 :(得分: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。您还可以单独配置每个处理程序的级别,以便始终看到警告及其上方。除了主记录器之外,每个处理程序都可以拥有自己的级别。

您可以refer to the tutorials了解如何更具体地了解关卡,处理程序和格式。

答案 1 :(得分: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)

答案 2 :(得分: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有更多信息