我有这段代码用Python设置我的记录器:
#Configure logging
logging.basicConfig(format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M',
filename= "log.txt",
level = logging.getLevelName('DEBUG'))
print(logging.getLogger().getEffectiveLevel())
但是print语句的输出有时是这样的:
30
其他时间(这是正确的):
10
但是,即使将日志记录级别设置为正确的数字,它也不会将任何内容记录到文件中,但有时也可以。我需要做些什么来确保我的日志记录级别设置正确?
*编辑:以下是基于@randomir推荐的解决方案。
**编辑:我在调用logging.basicConfig()
后设置级别时必须进行第二次更改,否则日志记录级别仍未得到一致调用。现在,`logging.getLogger()。setLevel(...)这一行似乎有效。
我创建了一个新类:Logger.py。
import logging
class Logger(object):
def __init__(self):
logging.basicConfig(format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M',
filename= "log.txt")
logging.getLogger().setLevel(logging.getLevelName("DEBUG"))
print(logging.getLogger().getEffectiveLevel())
现在我没有直接在我的启动类中配置基本配置,而只是实例化一次logger类:
from Logger import Logger
import logging
class LaunchPython(object):
#Configure Logging
Logger()
logging.info("Application has started")
在调用记录器的所有后续类中,我只需将import logging
置于顶部,然后执行logging.info(...)
或logging.debug(....)
。无需导入Logger.py类并重新实例化。
答案 0 :(得分:3)
logging.basicConfig()
为您的应用程序创建了一个根记录器(该记录器名为root
,您可以使用logging.getLogger('root')
或logging.getLogger()
获取该记录器
诀窍是root
记录器在第一次调用任何日志记录函数(如level=30
)时创建的默认值(如logging.info()
)如果它不存在已经。因此,请确保在登录应用程序的任何其他部分之前调用basicConfig()
。
您可以通过将记录器配置解压缩到单独的模块(如logger.py
),然后在每个模块中导入该模块来实现。或者,如果您的应用程序有一个中心入口点,那么只需在那里进行配置。请注意,如果不存在,您调用的第三方功能也会创建root
记录器。
另请注意,如果您的应用程序是多线程的:
注意强> 在启动其他线程之前,应该从主线程调用此函数。在2.7.1和3.2之前的Python版本中,如果从多个线程调用此函数,则可能(在极少数情况下)将处理程序多次添加到根记录器,从而导致意外结果(如消息)被复制在日志中。