転載:https://www.jianshu.com/p/e5595fd9f0e8
図3に示すように、プロセス・フロー・ストリーム・ログ
ロギングモジュールには4つのコンポーネントをログに記録します
コンポーネント名 | 対応するクラス名 | 機能説明 |
---|---|---|
ロガー | ロガー | これは、使用されている可能性がありインタフェースアプリケーションを提供します |
プロセッサ | ハンドラ | 出力を作成し、適切なLoggerオブジェクトに送信されたログレコード |
フィルタ | フィルタ | ログレコードは、廃棄された出力ログの決定するために、よりきめ細かい制御を提供することは、手段 |
フォーマッタ | フォーマッタ | 最終的な出力形式は、ログに依存します |
次のように最も一般的な構成は以下のとおりです。
方法 | 説明 |
---|---|
Logger.setLevel() | 重要度の設定ロガーの最小レベルは、ログメッセージを処理されます |
Logger.addHandler() | そしてLogger.removeHandlerは()ロガー・オブジェクト・ハンドラーのためにオブジェクトを追加および削除します |
Logger.addFilter() | そしてLogger.removeFilterは()ロガー・オブジェクトのフィルタオブジェクトを追加および削除します |
Loggerオブジェクトの設定が完了したら、次のような方法は、ログ・レコードを作成するために使用されてもよいです。
方法 | 説明 |
---|---|
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical() | そのメソッド名とロギングレベルの対応を作成します |
Logger.exception() | 同様のLogger.error()ログメッセージを作成します。 |
Logger.log() | あなたは、ログレコードを作成するために、明確なログレベルパラメータを取得する必要があります |
階層とロガーの効果的なレベルの記述:
-
ロガーがされるの名前「」セグメント化された階層構造、ロガー子供の前に 『後者はロガーである』 'のそれぞれは、例えば、FOOロガーの名前があり、他の名前はfoo.barあります子孫foo.bar.bazとfoo.bamすべてのfoo。
-
ロガーは、「有効レベル(有効レベル)」の概念を持っています。あなたは1に明確なセットを見つけるまで、親が明示的に設定したレベルは、効果的なレベルの親の親を探し続け、そのためになりますしない場合、それが明示的にロガーにレベルを設定されていない場合、ロガーは親のレベルを使用することです先祖のレベルまで。なお、ルートロガーは常に明確なレベル設定(デフォルトはWARNINGです)持っています。発生したイベントを処理するかどうかを決定する際に、効果的なレベルのロガーは、処理のためのロガーのハンドラにイベントを転送するかどうかを決定するために使用されます。
-
子ロガーは、ログメッセージを完了した後、デフォルトのメッセージング・ログ・ハンドラは、関連の祖先のロガーを提供します。したがって、すべてのロガーは、我々が使用したアプリケーションを持っていないハンドラを定義および設定されている、唯一のロガーを十分にすることができ、子を作成する必要が従って、トップレベルのロガーするように設定ハンドラに必要です。また、この配信メカニズムを閉じるにはFalseにロガーのプロパティによって伝播することができます。
ハンドラーカテゴリ:
ハンドラは、(ログメッセージのレベルに基づいて)オブジェクトの役割ハンドラ指定された場所(ファイル、ウェブ、メール、など)へのメッセージを配布しますです。Loggerオブジェクトは、はaddHandler()メソッドによって、ゼロ以上のオブジェクト・ハンドラ自体を追加することができます。たとえば、アプリケーションは次のログ要件を実装することもできます。
1)すべてのログは、ログファイルに送信されます。
2)すべての重大度レベルを超える又は伝送エラーログSTDOUT(標準出力)に等しいです。
3)すべての重大度レベルは、アドレスの重要なログに電子メールメッセージを送信します。このシナリオでは、3つの異なるハンドラを必要とする、各ハンドラは、特定の場所を記録する特定の重症度の複合体を送信します。
Handler.setLevel(LEL):指定した情報のレベルを処理する、情報がLELレベル以下では無視されます
)(Handler.setFormatterを:フォーマットを選択するには、このハンドラ
Handler.addFilter(FILT)を、Handler.removeFilter(FILT ): 新規作成フィルタオブジェクトを追加または削除
なお、アプリケーションコードを直接インスタンス化ハンドラインスタンスを使用すべきではありません。ハンドラが定義するのみ知られているハンドラは、いくつかのインターフェースであるべきであることをベースクラスであり、提供するので、いくつかのサブクラスのデフォルト動作は、直接的またはカバレッジを使用することができます。ここではいくつかの共通のハンドラは、次のとおりです。
ハンドラ | 説明 |
---|---|
logging.StreamHandler | このようstd.out、std.errまたは任意のファイルのようなオブジェクトとして、ストリームに出力を送信するメッセージをログに記録します。 |
logging.FileHandler | ディスクファイルにログメッセージを送信し、ファイルサイズは、デフォルトでは無限に成長します |
logging.handlers.RotatingFileHandler | カッティングによってディスクファイルにログメッセージを送信し、ログファイルのサイズをサポートしています |
logging.hanlders.TimedRotatingFileHandler | ディスクファイルにログメッセージを送信し、時間によってログファイルをカットサポート |
logging.handlers.HTTPHandler | 道にGETまたはPOST HTTPサーバを送信するログメッセージ |
logging.handlers.SMTPHandler | ログメッセージは、指定された電子メールアドレスに送信されます |
logging.NullHandler | 例ハンドラは通常、ライブラリ開発者が登場した情報「NOハンドラがロガーXXXのために見つかりませんでした」を避けるために使用使用するログは、エラーメッセージを無視します。 |
インポートログは DEF (ログ): #は、パラメータが空のロガーがルートを返している場合、ロガーを作成 ロガー= logging.getLogger(「ニック」) Logger.setLevel(logging.DEBUG) #設定ロガーログレベル #ロガー場合は、こちらの判断を.handlersリストが空である、追加、またはログの書き込みに直接移動IF ないlogger.handlersを: #はハンドラの作成 FHを= logging.FileHandler(" test.log "、エンコード= " UTF-8 " ) CH = logging.StreamHandler( )#は、出力ログ形式を設定しました =フォーマッタlogging.Formatter( FMT = " %(いるasctime)S%(名)S%(ファイル名)%S(メッセージ)S " 、 datefmt = " %Y /%のM / %% X-D " ) #ハンドラのフォーマット出力 fh.setFormatter(フォーマッタ) ch.setFormatter(フォーマッタ) #ロガーログプロセッサ追加の logger.addHandler(FH) logger.addHandler(CH) リターンロガー位直接ロガー返さ ロガー = ログ() ロガー.warning(「ムエタイの警告" ) Logger.info(" ヒント" ) logger.error(" エラー" ) logger.debug(" トラブルシューティング」)
自動的に時間に応じて遮断し、例数を指定するには、ファイルを保存します
インポートログ からロギングインポートハンドラ ロガー = logging.getLogger(__name__ ) LOG_FILE = " timelog.log " #FH = handlers.RotatingFileHandler(= LOG_FILEファイル名、MAXBYTES = 10、= BACKUPCOUNT。3) FH = handlers.TimedRotatingFileHandler(= LOG_FILEファイル名、場合= 「S 」、間隔= 5、BACKUPCOUNTは= 3) #のファイル名は、指定されたファイルに入力された情報を定義 #を指定単位はS(秒)、間隔の周波数間隔である場合によ指定された場合、単位は(ありますあなたは)周波数5Sを理解することができますので、backupCountは、ファイルの数は、私はここに3つのファイルが割り当てられていた、バックアップを示しています。 = logging.Formatterフォーマッタ(' %(いるasctime)S%(Module1の)S:%(LINENO)Dの%(メッセージ)S') #出力フォーマット定義 fh.setFormatter(フォーマッタ)を#フォーマット出力追加 logger.addHandler(FH) logger.warning(" TEST1 " ) (logger.warning " TEST2を" ) (logger.warning " Test3はを" ) logger.warning (" TEST4 ")