当前位置: 首页 > 知识库问答 >
问题:

Python日志记录:仅显示调试级别的信息

尉迟国发
2023-03-14

对于我在Python(2.7)中的第一个日志记录实验,我正在创建一个基本的日志记录模块,它将快速为创建一个记录器(这样我就不必为每个模块/类配置它)。

我想要做的是创建一个日志程序,它在控制台上显示所有级别信息及更高级别的消息,并将所有调试级别信息移动到一个文本文件中。

到目前为止,我已经创建了一个日志程序,它打印信息直到控制台,并将每个日志消息打印到一个文本文件。然而,我不想要所有的信息和更高的消息在我的文本文件。

我已经做了一个Python小提琴,用来保存我的代码。

我使用了教程中的以下调试消息:

log.debug('All systems operational')
log.info('Airspeed 300 knots')
log.warn('Low on fuel')
log.error('No fuel. Trying to glide.')
log.critical('Glide attempt failed. About to crash.')

在控制台上产生:

[INFO] root: Airspeed 300 knots
[WARNING] root: Low on fuel
[ERROR] root: No fuel. Trying to glide.
[CRITICAL] root: Glide attempt failed. About to crash.

在我的debug_log.txt文件中:

2013-06-14 14:51:46,963:DEBUG:root:All systems operational
2013-06-14 14:51:46,964:INFO:root:Airspeed 300 knots
2013-06-14 14:51:46,964:WARNING:root:Low on fuel
2013-06-14 14:51:46,964:ERROR:root:No fuel. Trying to glide.
2013-06-14 14:51:46,964:CRITICAL:root:Glide attempt failed. About to crash.

在上面的块中,后四行不应该在文件中。我想做的事情可能吗?我怎样才能得到我想要的结果?

共有1个答案

纪鸿禧
2023-03-14

您必须创建自己的处理程序对象。

来自文档:位于核心日志记录包中的FileHandler类将日志记录输出发送到磁盘文件。它继承了StreamHandler的输出功能。因此这里的想法是扩展FileHandler类,并在emit()方法中,筛选出不在logging.debug级别的所有record对象。

我没有测试过它,但我认为它可以起作用:

from logging import FileHandler, DEBUG

log = logging.getLogger('foo')


class DebugFileHandler(FileHandler):
    def __init__(self, filename, mode='a', encoding=None, delay=False)
        super().__init__(filename, mode, encoding, delay)
    
    def emit(self, record):
        if not record.levelno == DEBUG:
            return
        super().emit(record)

log.addHandler(DebugFileHandler())

当然,您必须使此代码与您的代码相适应。而且,老实说,record.level是一种胡乱的猜测,但我认为这是有道理的:-)而且,我猜对了!

在本例中,处理程序将仅应用于foo记录器。您可能希望为您的主处理程序激活它,或者只为某些特定的处理程序激活它,这是您可能更喜欢的。

 类似资料:
  • 我怀疑这可能是我包含的一个库,它正在扰乱我的日志。这有可能吗?librray可以改变我的日志显示方式吗?既然我有点迷路了,我该怎么调查呢?

  • 我使用Kubernetes作为cron作业运行python脚本。问题是,直到作业完成后,我才看到脚本的输出(可能需要一段时间才能运行)。我怀疑这是由于日志记录级别(--v选项)造成的,但在我的整个生命周期中,我都找不到它的文档(默认为--v=0)。如果我想增加输出内容的详细程度,是否有人知道“INFO”或“TRACE”的值(或者这些值是什么/定义在哪里)?提前谢谢你的帮助。 编辑:是否有人在Kub

  • 我希望将具有特定记录器名称、特定级别和更高级别(例如和更高级别)的消息记录到特定日志处理程序(例如文件处理程序),同时仍将所有日志消息发送到控制台。Python是2.7版。 到目前为止,我尝试创建了两个记录器: 根记录器 命名记录器 对于根记录器,我附加了,并将日志级别设置为。 然后,我将一个处理程序附加到命名记录器,并将该记录器的级别设置为。 当我现在调用使用命名记录器的模块时,我不再获得传播到

  • 一般来说,你应该在运行时增加调试选项来调试问题;也可以把调试选项添加到 Ceph 配置文件里来调试启动问题,然后查看 /var/log/ceph (默认位置)下的日志文件。 Tip 调试输出会拖慢系统,这种延时有可能掩盖竞争条件。 日志记录是资源密集任务。如果你碰到的问题在集群的某个特定区域,只启用那个区域对应的日志功能即可。例如,你的 OSD 运行良好、元数据服务器却不行,这时应该先打开那个可疑

  • 有人能帮我设置日志级别以调试和捕获更多日志所需的spark配置吗

  • 问题内容: 我正在使用python日志记录模块在python代码中记录事件。我也希望记录2个日志文件,一个包含用户信息,另一个包含针对开发人员的更详细的日志文件。我已将两个日志文件设置为所需的级别(usr.log = INFO和dev.log = ERROR),但无法解决如何将日志记录限制为usr.log文件,因此仅写入INFO级别日志到日志文件,而不是INFO以及上面的所有其他内容,例如INFO