2013-10-31 51 views
2

我試圖過濾通過UDP傳遞的Python日誌記錄消息,但由於某種原因,在接收端設置loglevel似乎不會影響傳入的消息。Python上的UDP記錄忽略setLevel()

接收端的代碼如下:

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,我仍然看到調試消息的事實。如果我while循環前添加

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

,我看到信息的消息,但沒有調試一個,表明setLevel正在本地,但不影響過來UDP套接字消息。

任何想法,爲什麼會發生這種情況?如果我手動檢查收到的字典的'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) 

回答

2

Logger.handle()是指被稱爲後級別檢查的方法,這就是爲什麼記錄器上設置的級別無效。在源端進行級別設置通常會更好(爲了避免浪費網絡帶寬),否則您可以在接收端設置處理程序級別(不可能使用basicConfig(),這是最簡單的用法 - 而且您的isn海事組織)。所以,你可以做(​​在接收端):

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()電話。

+0

完美的作品!非常感謝你。 (然後我再也不感到驚訝......我知道你的名字看起來很熟悉,花了我一點時間來弄清楚爲什麼!) – ryantmer