我正在尝试过滤来自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)
答案 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()
来电。