在python中记录混乱

时间:2019-08-22 09:48:36

标签: python python-3.x logging

我想创建两个日志文件,一个记录所有内容,另一个记录日志,只记录警告和错误。

这是我的代码,

import logging


logger = logging.getLogger(__name__)

# custom log handlers
err_handler = logging.FileHandler(filename='error.log')
info_handler = logging.FileHandler(filename='info.log')
# setting levels of the handlers
err_handler.setLevel(logging.WARNING)
info_handler.setLevel(logging.INFO)
# formatting for handlers
err_formatter = logging.Formatter('%(name)s - %(asctime)s - %(levelname)s - %(funcName)s - %(message)s')
info_formatter = logging.Formatter('%(name)s - %(asctime)s - %(levelname)s - %(funcName)s - %(message)s')
# setting the formatters
err_handler.setFormatter(err_formatter)
info_handler.setFormatter(info_formatter)
# add the handlers to the custom logger
logger.addHandler(err_handler)
logger.addHandler(info_handler)


logger.info('test_info')
logger.warning('test_warn')
logger.error('test_err')
logger.info('test_info')

输出文件为:

info.log
__main__ - 2019-08-22 15:13:36,625 - WARNING - <module> - test_warn
__main__ - 2019-08-22 15:13:36,625 - ERROR - <module> - test_err
错误日志
__main__ - 2019-08-22 15:13:36,625 - WARNING - <module> - test_warn
__main__ - 2019-08-22 15:13:36,625 - ERROR - <module> - test_err

为什么信息日志没有显示?

4 个答案:

答案 0 :(得分:2)

好吧,日志就像过滤器一样工作。 logger-> handler。因此,首先需要确保记录器的级别至少为INFO

logger.setLevel(logging.INFO)之后添加logger = logging.getLogger(__name__)

答案 1 :(得分:2)

As mentionned in the doc

  

记录器具有有效级别的概念。如果未在记录器上显式设置级别,则将其父级别用作其有效级别。如果父级没有显式设置的级别,则检查其父级,依此类推-搜索所有祖先,直到找到显式设置的级别。根记录器始终具有明确的级别集(默认情况下为警告)。

正如西蒙·斯劳(Simon And Sraw)所述,这就是为什么您必须将记录器的级别至少设置为您感兴趣的较低级别的原因。

这就是说,手动配置是PITA when you can use dictConfig instead

哦,是的,文档(至少是恕我直言)至少没有明确指出并且一开始常常不理解的一个非常重要的事情是,日志记录配置永远不能由您的库代码完成,但是仅通过主(入口点)脚本。

这里的要点是,根据代码的使用方式,您将需要不同的配置。即使对于同一个项目,您可能也希望将所有内容都记录到sys.stderr中进行开发,并且仅将重要的内容(记录到文件,syslog或其他内容)记录在生产环境中-并且不要谈论其他应用程序将使用的纯libs具有完全不同的执行环境和日志记录需求。

IOW,您想要的是:

  • 您的库代码得到一个记录器(最好像您一样使用__name__)并使用它从未对其进行配置(好吧,比照{{3} })

  • 您的应用程序入口点代码可配置记录器(当然,如果需要,也可以使用一个)。

答案 2 :(得分:0)

我相信这里的窍门是将记录器本身的记录级别设置为最低的关注级别。因此,设置logger.setLevel(logging.INFO),您应该会看到所需的行为。

答案 3 :(得分:0)

应该将记录器配置为接受特定日志级别的LogRecords。如果未设置任何级别,则WARNING是根记录器假定的默认级别。

因此,设置logger.setLevel(logging.DEBUG),以便记录器接受所有记录。

然后在处理程序中,您可以配置为从特定级别过滤日志记录。

顺便说一句,如果您要对两个日志文件使用相同的格式,那么您将使用相同的格式化程序对象。

logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(name)s - %(asctime)s - %(levelname)s - %(funcName)s - %(message)s')
err_handler.setFormatter(formatter)
info_handler.setFormatter(formatter)