【问题标题】:Python logging over UDP ignoring setLevel()Python 通过 UDP 记录忽略 setLevel()
【发布时间】:2013-10-31 17:50:24
【问题描述】:

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

接收端代码如下:

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)

【问题讨论】:

    标签: python logging udp


    【解决方案1】:

    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()调用。

    【讨论】:

    • 完美运行!非常感谢。 (话又说回来,我并不感到惊讶......我知道你的名字看起来很熟悉,花了我一点时间来弄清楚为什么!)
    • DatagramHandler 忽略 handler.setFormatter(formatter)
    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多