Python 通过 UDP 记录忽略 setLevel()

标签 python logging udp

我正在尝试过滤来自 UDP 的 Python 日志消息,但出于某种原因,在接收端设置日志级别似乎不会影响传入消息。

接收端代码如下:

import cPickle
import logging
import socket

logging.basicConfig(format='%(asctime)s %(levelname)-8s %(message)s')
logger = logging.getLogger()
logger.setLevel(logging.INFO)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 51010))

while True:
    d, _ = s.recvfrom(1024)
    log = cPickle.loads(d[4:])
    logger.handle(logging.makeLogRecord(log))

尽管我已将日志记录级别设置为 logging.INFO,但我仍然看到调试消息。如果我添加

logging.debug("Debug")
logging.info("Info")

在 while 循环之前,我看到了信息消息,但没有看到调试消息,这表明 setLevel 在本地工作,但不影响通过 UDP 套接字传入的消息。

知道为什么会发生这种情况吗?如果我手动检查接收到的 dict 的 'levelno' 字段(然后变成日志记录),它是 10(调试),但过滤似乎并不关心......

谢谢!

编辑:

作为引用,生成通过 UDP 发送的数据包的代码很简单

import logging
import logging.handlers
import time

logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s %(levelname)-8s %(message)s')

logging.getLogger().addHandler(logging.handlers.DatagramHandler('', 51010))

while True:
    logging.debug("This shouldn't show up")
    logging.info("This should show up")
    time.sleep(3)

最佳答案

Logger.handle() 是一种在 级别检查之后调用的方法,这就是记录器上设置的级别无效的原因。通常最好在源端进行级别设置(以避免浪费网络带宽),否则您可以在接收端的处理程序上设置级别(使用 basicConfig() 是不可能的,这是意味着最简单的用法 - 而你的不是,IMO)。所以你可以这样做(在接收端):

handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
# setting a Formatter to customise the logs is not shown, but
# you can add it here
logging.getLogger().addHandler(handler)

以上是 basicConfig() 调用的替代。

关于Python 通过 UDP 记录忽略 setLevel(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713419/

相关文章:

logging - 限制kubernetes中的日志

c++ - 从网络队列中读取多个数据报

udp - gstreamer 的 udpsink 在发送约 1000 个数据包后停止流式传输

linux - 通过 802.11n 的 UDP 单播 - L2 积极 ACK 对 Linux 套接字发送缓冲区的影响

python - 在 DJANGO 中加载管理员和我的页面的 CSS 时出现问题

python - 使用 REGEX 通过脚本检查 XML 节点

python - 如何直接在 AWS Lambda 中导入 Google 模块?

scala - 如何通过 sbt compile 抑制警告

python - 在Python中将字符串日期解析为日期对象

javascript - stateChangeStart - AngularJS