4

Python スクリプトのログ出力にコンテキスト情報を追加しようとしています。基本的に、受信ネットワーク接続を処理するために SocketServer クラスを使用しています。クライアントがサーバーにメッセージを送信するときは、STDOUT にログ エントリを作成し、時間、ログ レベル、クライアントの IP とメッセージを受け取りました。

私はフィルターを使用してこれを実装しようとしました (これは機能しませんでしたが、提案は受け付けています) と LoggerAdapter: http://pastebin.com/peT0rjA7

class ConnInfo:
    def __getitem__(self, name):
        if name == "ip":
            result = tlocal.ip
        if name == "cmd":
            result = tlocal.msg
        return result
    def __iter__(self):
        keys = ['ip', 'cmd']
        keys.extend(self.__dict__.keys())
        return keys.__iter__()

logging.basicConfig(level=logging.DEBUG,
                    format="%(asctime)s %(name)-12s %(levelname)-8s %(message)s",
                    datefmt="%d-%m %H:%M:%S",
                    filename="distpovadmin.log",
                    filemode="w")
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
nodeCommsConFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(ip)-4s %(cmd)-8s %(message)s')
console.setFormatter(formatter)

#nodeCommsConLogging = logging.LoggerAdapter(logging.getLogger('NodeCommsConnection').addHandler(console.setFormatter(nodeCommsConFormatter())), ConnInfo())
CommsConConsole = logging.StreamHandler()
CommsConConsole.setLevel(logging.INFO)
CommsConConsole.setFormatter(nodeCommsConFormatter)
nodeCommsConLogging = logging.LoggerAdapter(logging.getLogger('NodeCommsConnection'), ConnInfo())
logging.getLogger('NodeCommsConnection').removeHandler(console)
logging.getLogger('NodeCommsConnection').addHandler(CommsConConsole)

logging.getLogger('').addHandler(console)

次のように nodeCommsConLogging を呼び出すと:

nodeCommsConLogging.info("Message Received")

STDOUT ログに重複したエントリが表示されます

NodeCommsConnection: INFO     192.168.1.8 REQ;     Message Received
NodeCommsConnection: INFO     Message Received

助けと提案を前もってありがとう!

編集:コード例を追加

4

1 に答える 1

10

ロガーは階層的です。これで、ルート ロガー (という名前''、つまり空白) が作成されました。他のすべてのロガーは、最終的にルート ロガーの子になります。

あなたの場合、次の階層があります。

 root
   +-- NodeCommsConnection

子で何かをログに記録すると、それを処理しようとし、 に設定しない限り、ログ メッセージを親ロガーに渡します。propagateFalse

にアペンダーを追加するためNodeCommsConnection、このアペンダーを使用してメッセージをログに記録し、root を呼び出して、そのアペンダーを使用してログを記録します -> コンソールに 2 つの出力。

したがって、アペンダーをルート ロガーに追加する (およびデフォルトのコンソール ロガーを削除する) か、次のように設定propagateFalseます。

logging.getLogger('NodeCommsConnection').propagate = False
于 2012-07-26T09:59:01.723 に答える