4

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)
4

1 に答える 1

3

Logger.handle()は、レベル チェックのに呼び出されることを意図したメソッドです。これが、ロガーに設定されたレベルが無効である理由です。一般に、ソース側でレベル設定を行う方がよい (ネットワーク帯域幅の浪費を避けるため)、または、受信側でハンドラーにレベルを設定することができます (basicConfig()最も単純な使用法を意図した を使用することはできません。 t、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()呼び出しの代わりです。

于 2013-10-31T21:06:27.487 に答える