16

これが私のシナリオです。my_moduleのアクティビティをログに記録したいと思います。これは、実行されるメソッド(たとえば、INPUTとOUTPUT)に応じて、2つの異なるファイルに対して実行する必要があります。

したがって、2つのハンドラーがあり、それぞれが同じログレベルの異なるファイル(my_in_.logとmy_out_.log)を指しています。同じロガーを使用してこれを実現できるかどうか、または2つのロガーを定義する必要があるかどうかを知りたいです。私の設定は次のとおりです。

[loggers]
keys=root, my_log

[handlers]
keys=my_in_hand, my_out_hand

[formatters]
keys=generic_form


...


[logger_my_log]
level=NOTSET
handlers=my_in_hand, my_out_hand
qualname=ws_log

[handler_my_in_hand]
class=handlers.TimeRotatingFileHandler
level=NOTSET
formatter=generic_form
args=('my_in_.log', 'h', 1, 0, None, False, True)

[handler_my_out_hand]
class=handlers.TimeRotatingFileHandler
level=NOTSET
formatter=generic_form
args=('my_out_.log', 'h', 1, 0, None, False, True)

ハンドラー/宛先ごとにロガーを定義する必要がありますか(異なるファイルに異なる情報を記録したいため)?どのハンドラーがこれを行うかをロガーに示す方法はありますか?つまり、1つのロガーに対して2つのハンドラーがあり、1つのメソッドをログに記録するために1つのハンドラーのみを選択します。

4

3 に答える 3

9

ログを送信する宛先ごとにハンドラーをインスタンス化してから、2つのハンドラーをロガーに追加する必要があります。以下は機能するはずです(ただし、テストはしていません)。

logger = logging.getLogger()
handler1 = logging.TimedRotatingFileHandler()
handler2 = logging.TimedRotatingFileHandler()
logger.addHandler(handler1)
logger.addHandler(handler2)

もちろん、必要になる可能性のあるすべての構成およびフォーマットオプションを追加します。基本的には、ロギングハンドラーをインスタンス化するときに、それをロガーに追加できることを示すだけです。その瞬間から、ログレコードはロガーに追加されたすべてのハンドラーに送信されます。

于 2013-03-04T11:19:50.957 に答える
9

あなたがしたいのは

  1. 2つの非ルートロガーを作成します。
  2. それぞれのハンドラーを作成し、異なるファイルをポイントします
  3. 適切なロガーにハンドラーを追加します

    logger1 = logging.getLogger('general_logger')
    logger2 = logging.getLogger('some_other_logger')
    
    log_handler1 = logging.handlers.RotatingFileHandler(file_1, *args)
    log_handler2 = logging.handlers.RotatingFileHandler(file_2, *args)
    
    logger1.addHandler(log_handler1)
    logger2.addHandler(log_handler2)
    

それから

    logger1.info("this will be logged to file_1 ")
    logger2.info("this will be logged to file_2 ")

ルートロガーと別のロガーを作成した場合、ルートロガーはこの別のコントローラーがログに記録しようとしているすべてのものをログに記録することに注意してください。

言い換えれば、

    root_logger = logging.getLogger()
    logger2 = logging.getLogger('some_other_logger')

    root_log_handler = logging.handlers.RotatingFileHandler(file_1, *args)
    log_handler2 = logging.handlers.RotatingFileHandler(file_2, *args)

    root_logger.addHandler(root_log_handler)
    logger2.addHandler(log_handler2)

それから

    root_logger.info("this will be logged to file_1 ")
    logger2.info("this will be logged to file_1 AND file_2 ")
于 2013-05-15T00:40:24.120 に答える
6

最後に、2つのロガーを定義することにしました。理由は次のとおりです。

  • それらは異なる目的のためのものです。私の場合、1つはWebサービスへの入力要求をログに記録し、もう1つは応答をログに記録します。そして、彼らはそれに異なるファイルを使用します

  • フロントWebサービスでロギング構成ファイルを使用しています。@mikeが言ったように、メッセージをログに記録する前にハンドラーを追加/削除することは正しいアプローチではありません。@drekynにもThx!

これが私のロギング設定ファイルです。誰かが興味を持っている場合の参考のために:

[loggers]
keys=root, ws_in_log, ws_out_log

[handlers]
keys=consoleHandler, ws_in_hand, ws_out_hand

[formatters]
keys=generic_form

[logger_root]
handlers=consoleHandler
level=NOTSET

[logger_ws_in_log]
level=NOTSET
handlers=ws_in_hand
qualname=ws_in_log

[logger_ws_out_log]
level=NOTSET
handlers=ws_out_hand
qualname=ws_out_log

[handler_ws_in_hand]
class=logging.handlers.TimedRotatingFileHandler
level=NOTSET
formatter=generic_form
args=('/path/ws_in_.log', 'h', 1, 0, None, False, True)

[handler_ws_out_hand]
class=logging.handlers.TimedRotatingFileHandler
level=NOTSET
formatter=generic_form
args=('/path/em/ws_out_.log', 'h', 1, 0, None, False, True)

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=generic_form
args=(sys.stdout,)

[formatter_generic_form]
format='%(asctime)s - %(levelname)s - %(message)s'
datefmt='%Y-%m-%d %H:%M:%S'
class=

またね!

于 2013-03-05T12:20:05.600 に答える