通过UDP进行Python记录忽略setLevel()

时间:2013-10-31 17:50:24

标签: python logging udp

我正在尝试过滤来自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循环之前,我看到了info消息,但没有看到调试消息,表明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)

1 个答案:

答案 0 :(得分: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()来电。