如果在整个代码库中存在日志记录语句,如何设置记录器,以便在将代码部署到生产环境中时不必注释掉对记录器的每次调用?
这是我目前的代码:
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')
答案 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有更多信息