Twisted: 禁用Twisted框架类的日志记录

3 投票
1 回答
2041 浏览
提问于 2025-04-17 02:02

我的基于Twisted的客户端在一个循环中发送UDP数据包。为此,我使用了DatagramProtocol这个类。以下是源代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from twisted.application.service import Service
from twisted.internet import reactor
from twisted.internet.task import LoopingCall
from twisted.internet.protocol import DatagramProtocol
from twisted.python import log
import logging

class HeartbeatClient(Service):
    def __init__(self, host, port, data, beat_period):
        self.ip = host
        self.port = int(port)
        self.data = data
        self.beat = int(beat_period)

    def startService(self):
        self._call = LoopingCall(self._heartbeat)
        self._call.start(self.beat)

    def stopService(self):
        self._call.stop()

    def _heartbeat(self):
        protocol = DatagramProtocol()
        protocol.noisy = False
        port = reactor.listenUDP(0, protocol)
        port.write(self.data, (self.ip, self.port))
        port.stopListening()

现在,当我用twistd运行这个客户端时,我总是会收到来自Twisted类的日志消息,特别是来自DatagramProtocol这个类的消息:

2011-09-11 18:39:25+0200 [-] (Port 55681 Closed)
2011-09-11 18:39:30+0200 [-] twisted.internet.protocol.DatagramProtocol starting on 44903
2011-09-11 18:39:30+0200 [-] (Port 44903 Closed)
2011-09-11 18:39:35+0200 [-] twisted.internet.protocol.DatagramProtocol starting on 50044
2011-09-11 18:39:35+0200 [-] (Port 50044 Closed)
2011-09-11 18:39:40+0200 [-] twisted.internet.protocol.DatagramProtocol starting on 37450

因为这些日志消息让我自己的日志变得杂乱,所以我想知道是否可以关闭这些日志消息。正如你所看到的,我已经通过调用 protocol.noisy = False 来减少日志的数量,但我仍然收到了其他日志消息。此外,命令 g = protocol.ClientFactory().noisy = False 也没有帮助。

有没有办法以一种通用的方式禁用所有Twisted内部类的日志记录,也就是对所有模块都有效?也许可以通过一些Twisted日志配置来实现?

1 个回答

5

Twisted的日志系统其实很简单。不过,这并不意味着它只能这样,因为twisted.python.log功能很强大,可以实现你(和其他人)想要的那种选择性记录。

一个日志事件就是一个包含任意键值对的字典。默认的观察者只知道包含'message'这个键的字典。也许正因为这样,大多数Twisted自己发出的日志信息只提供了与这个键相关的人类可读字符串(而且,很多日志信息是在当前的Twisted日志系统之前就添加的,所以它们是由更旧、更简单的系统处理的)。

不久前,有人对此问题感到困扰,于是提交了一个问题单,并开始着手解决与UDP相关的问题。这个问题大部分已经解决,但还有一些事情需要完成。

尝试的解决方案是记录一个结构化的信息,这个信息传达了相同的内容,但没有消息,因此不会被默认观察者记录。这样可以避免这些消息默认出现在日志中,但允许对这些事件感兴趣的观察者观察并处理它们。

这个问题单已经放置了一段时间没有人处理。可能会很简单,有人可以接手这个补丁,把它完成最后的部分。

撰写回答