Python 日志记录级别随机更改,并不总是写入文件
我有一段代码可以用Python设置我的记录器:Python 日志记录级别随机更改,并不总是写入文件,python,logging,Python,Logging,我有一段代码可以用Python设置我的记录器: #Configure logging logging.basicConfig(format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M', filename= "log.txt", level = l
#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
其他时间是这样的(这是正确的):
但通常,即使将日志记录级别设置为正确的数字,它也不会将任何内容记录到文件中,但在其他情况下,它可以工作。我需要做什么来确保我的日志记录级别设置正确
*编辑:以下是我根据@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())
现在,我不再直接在startup类中配置基本配置,而是实例化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类并重新实例化它。为您的应用程序创建一个根记录器(这是一个名为root
的记录器,您可以通过logging.getLogger('root')
,或logging.getLogger()
)获得它)
诀窍在于,如果日志记录函数(如logging.info()
)不存在,则在第一次调用任何日志记录函数(如logging.info()
)时,使用默认值(如level=30
)创建根日志记录程序。因此,请确保在登录应用程序的任何其他部分之前调用basicConfig()
您可以通过将记录器配置提取到一个单独的模块,如logger.py
,然后在每个模块中导入该模块来实现这一点。或者,如果您的应用程序有一个中心入口点,只需在那里进行配置即可。请注意,您调用的第三方函数还将创建root
记录器(如果不存在)
另外请注意,如果您的应用程序是多线程的:
注意
在启动其他线程之前,应该从主线程调用此函数。在2.7.1和3.2之前的Python版本中,如果从多个线程调用此函数,则可能(在极少数情况下)将处理程序多次添加到根日志记录器,从而导致意外结果,例如日志中的消息被复制
你有更多的上下文吗?如果我简单地复制/粘贴您的代码样本并运行它,我会得到10。您是否在任何地方都使用相同的记录器?是否声明一次,然后导入到所有模块中?@Finch_通常在我第一次从新的QT控制台运行应用程序时,它会输出正确的调试编号,但如果我随后运行它,它会开始大部分输出30。@PRMoureu我在任何地方都使用默认的记录器(logging.info(…)
)。有时一切正常,日志文件被正确写入,但有时它只被部分写入,但更恼人的是调试级别并没有保持不变。您可能会遇到竞争条件,有时,在调用logging.basicConfig
之前,将创建记录器。是的,创建一个单独的logger.py类非常有效。我添加了一个根据您的建议创建的解决方案。
from Logger import Logger
import logging
class LaunchPython(object):
#Configure Logging
Logger()
logging.info("Application has started")