1

I've been reading the Python logging documentation, and its certainly has a lot of functionality...for everything.

The problem I'm facing is that I'm not Dutch and so I'm not sure what the right way to do this is.

I am running events in a simulator, and I would like to prefix every log message with the timestamp of the simulated time (probably with a length formatter too, just to keep it looking good). I could change this in a subclass of Logger or Handler, but I don't think that is the right way.

I think the right way is to use a LoggerAdapter or a Filter. Is this right, and if so, which one should I prefer?

4

1 に答える 1

2

すべてのログ メッセージにタイムスタンプのプレフィックスを付ける必要がある場合は、フォーマッタに適切なフォーマット文字列を指定するだけでよいでしょうか? ドキュメントでここに記載されているように。

更新: ALoggerAdapterは、コンテキスト情報が適度に長く存続する状況により適しています。たとえば、複数のクライアント接続を処理するネットワーク サーバー アプリケーションでは、接続の詳細 (クライアント IP アドレスなど) が有用なコンテキストになる場合があるためLoggerAdapter、新しいクライアント接続が作成されたときにインスタンスを作成します。これは、シミュレーション シナリオのようには聞こえません。

一方、 AFilterは、シミュレーション時間を取得するために使用できる場合に使用できます。

class SimulationFilter(logging.Filter):
    def __init__(self, context):
        """
        Set up with context passed in which allows access
        to simulation times.
        """
        self.context = context

    def filter(self, record):
        "Add sim_time field to record, formatted as you wish"
        record.sim_time = '%s' % self.context.get_sim_time()
        return True

次に、フォーマット文字列を追加%(sim_time)sします。Formatter

または、ロギング呼び出しを行うたびにシミュレーション時間がわかっている場合は、次のようにすることもできます。

logger.debug('Message with %s', arguments, extra={'sim_time': sim_time})

同様に%(sim_time)sFormatterフォーマット文字列に含まれています。

于 2013-04-17T23:12:16.037 に答える