ログ
ログは、ソフトウェアの実行中に発生するイベントを追跡する方法です。ソフトウェア開発者は、コード内のログ関数を呼び出して、特定のイベントが発生したことを示します。イベントは説明メッセージで記述され、オプションで可変データ(つまり、イベントの発生ごとに異なるデータになる可能性があります)をオプションで含めることができます。インシデントには、開発者がインシデントに起因する重要度もあり、重要度はレベルまたは重大度と呼ばれることもあります。
ロギングは、単純なロギングに便利な一連の機能を提供します。デバッグ()、情報()、警告()、エラー()、およびクリティカル()です。
ロギング機能には、追跡に使用されるイベントのレベルまたは重大度に応じて名前が付けられます。標準レベルとその適用可能性は、次のように説明されます(重大度の高い順に)。
レベル | いつ使うか |
---|---|
DEBUG |
詳細情報は通常、問題のデバッグ時にのみ使用されます。 |
INFO |
物事が期待どおりに機能していることを証明します。 |
WARNING |
将来発生する可能性のある予期しないイベントまたは問題についてプロンプトを出します。例:ディスク容量不足。ただし、ソフトウェアは引き続き通常どおり実行されます。 |
ERROR |
より深刻な問題により、ソフトウェアは一部の機能を実行できなくなりました。 |
CRITICAL |
深刻なエラーは、ソフトウェアが実行できなくなったことを示します。 |
レベル | 数値 |
---|---|
CRITICAL |
50 |
ERROR |
40 |
WARNING |
30 |
INFO |
20 |
DEBUG |
10 |
NOTSET |
0 |
デフォルトのレベルはですWARNING
。つまり、ロギングモジュールを使用して他のことを行わない限り、このレベル以上のみが情報をフィードバックします。
追跡されたイベントは、さまざまな方法で処理できます。それを処理する最も簡単な方法は、それらをコンソールに印刷することです。別の一般的な方法は、ディスクファイルに書き込むことです。
1.コンソールに出力する
import logging logging.debug( 'デバッグ情報') logging.warning( 'これだけが出力されます...') logging.info( '情報情報')
デフォルトのレベルは警告であるため、すべての警告のみの情報がコンソールに出力されます。
警告:root:これだけが出力されます。。。
logging.basicConfig()を使用して、情報をコンソールに出力します
インポートロギング logging.basicConfig(format = '%(asctime)s-%(pathname)s [line:%(lineno)d]-%(levelname)s:%(message)s'、 level = logging.DEBUG) logging .debug( 'debug信息') logging.info( '情報信息') logging.warning( '警告信息') logging.error( 'エラー信息') logging.critical( '重要な信息')
logging.basicConfig()のlevelの値はlogging.DEBUGに設定されているため、すべてのデバッグ、情報、警告、エラー、および重要なログがコンソールに出力されます。
ログレベル:debug <info <warning <error <critical logging.debug( 'デバッグレベル、最低レベル、一般的な開発者が一部のデバッグ情報を 出力するために使用します')logging.info( 'infoレベル、通常の出力情報、通常は出力に使用しますいくつかの通常の操作 ') logging.warning('警告レベル、一般的に警告メッセージを出力するために使用されます ') logging.error('エラーレベル、一般的にいくつかのエラーメッセージを出力するために使用されます ') logging.critical('クリティカルレベル、一般的に使用されますいくつかの致命的なエラーメッセージ、最高レベルを出力します ')
したがって、level = logging.info()を設定した場合、デバッグ情報はコンソールに出力されません。
次に、logging.basicConfig()を使用してログをファイルに保存します
logging.basicConfig(レベル= logging.DEBUG、#コンソールによって出力されるログレベル ファイル名= 'new.log'、ファイル モード= 'a'、##モード、wとaがあり、wは書き込みモードで、毎回書き換えられますログ、前のログを上書き #aは追加モード、書き込みしない場合のデフォルト、追加モード format = '%(asctime)s-%(pathname)s [line:%(lineno)d]-%(levelname)s :%(メッセージ)sの #log形式 )
logging.basicConfig()でファイル名とファイルモードを設定すると、ログのみがファイルに保存され、コンソールには出力されません。
第三に、前の画面入力だけでなく、ログをファイルに書き込む
ロギングライブラリはモジュール式の設計になっており、ロガー、プロセッサ、フィルタ、フォーマッタなどの多くのコンポーネントを提供します。
- ロガーは、アプリケーションコードが直接使用できるインターフェースを公開します。
- ハンドラーは(レコーダーによって生成された)ログ・レコードを適切な宛先に送信します。
- Filterはより細かい制御を提供し、どのログレコードを出力するかを決定できます。
- フォーマッタは、最終出力でのログレコードのレイアウトを示します。
ロガー:
ロガーオブジェクトは3つのことを行います。まず、アプリケーションが実行時にメッセージを記録できるように、アプリケーションコードに多くのメソッドを公開します。次に、ロガーオブジェクトは、重大度(デフォルトのフィルタリング機能)またはフィルターオブジェクトによって記録する必要があるログメッセージを決定します。3番目に、ロガーオブジェクトは関連するログメッセージをすべての関係するログプロセッサに渡します。
ロガーオブジェクトの一般的なメソッドは、構成とメッセージ送信の2つのカテゴリに分類されます。
これらは、最も一般的に使用される構成方法です。
Logger.setLevel()は、ロガーが処理する最低のセキュリティレベルのログ情報を指定します。デバッグは最低の組み込みセキュリティレベル、クリティカルは最高の組み込みセキュリティレベルです。たとえば、重大度がINFOの場合、レコーダーはINFO、WARNING、ERROR、およびCRITICALメッセージのみを処理し、DEBUGメッセージは無視されます。
Logger.addHandler()およびLogger.removeHandler()は、ロガーオブジェクトにハンドラーオブジェクトを追加および削除します。詳細については、ハンドラを参照してください。
Logger.addFilter()およびLogger.removeFilter()は、ロガーオブジェクトにフィルターオブジェクトを追加および削除します。
ハンドラー
处理程序
オブジェクトは、適切なログメッセージ(ログメッセージの重大度に基づく)をハンドラーの指定されたターゲットにディスパッチする役割を果たします。Logger
オブジェクトはaddHandler()
、メソッドを介して0個以上のハンドラーオブジェクトを追加できます。たとえば、アプリケーションはすべてのログメッセージをログファイルに送信し、エラーレベル以上のすべてのログメッセージを標準出力に送信し、クリティカルレベル(critical)のすべてのログメッセージを電子メールアドレスに送信できます。この例では、3つの独立したプロセッサが必要であり、それぞれが特定のレベルのメッセージを特定の場所に送信します。
一般的に使用される4つがあります。
1)logging.StreamHandler->コンソール出力
このハンドラーを使用して、sys.stdoutまたはsys.stderrと同様のファイルオブジェクトに情報を出力します。
そのコンストラクタは次の
とおりです。StreamHandler([strm])
ここで、strmパラメータはファイルオブジェクトです。デフォルトはsys.stderrです。
2) logging.FileHandler->ファイル出力
StreamHandlerと同様に、ログ情報をファイルに出力するために使用されます。しかし、FileHandlerはこのファイルを開くのに役立ちます。そのコンストラクタは次のとおりです
。FileHandler(filename [、mode])
filenameはファイル名です。ファイル名を指定する必要があります。
モードは、ファイルを開く方法です。デフォルトは「a」で、ファイルの最後に追加されます。
3) logging.handlers.RotatingFileHandler- >サイズに応じてログファイルを自動的に分割し、指定したサイズに達したらファイルを再生成します
このハンドラーは、上記のFileHandlerに似ていますが、ファイルサイズを管理できます。ファイルが特定のサイズに達すると、現在のログファイルの名前が自動的に変更され、同じ名前で新しいログファイルが作成されて出力が続行されます。たとえば、ログファイルはchat.logです。chat.logが指定されたサイズに達すると、RotatingFileHandlerは自動的にファイルの名前をchat.log.1に変更します。ただし、chat.log.1がすでに存在する場合は、まずchat.log.1の名前をchat.log.2に変更します。。。最後に、chat.logを再作成し、引き続きログ情報を出力します。そのコンストラクタは次のとおり
です。RotatingFileHandler(filename [、mode [、maxBytes [、backupCount]]])
ここで、ファイル名とモードはFileHandlerと同じです。
maxBytesは、ログファイルの最大ファイルサイズを指定するために使用されます。maxBytesが0の場合、つまりログファイルが無限に大きくなる可能性がある場合、上記の名前変更プロセスは発生しません。
backupCountは、予約済みバックアップファイルの数を指定するために使用されます。たとえば、2と指定した場合、上記の名前変更プロセスが発生すると、元のchat.log.2の名前は変更されず、削除されます。
4) logging.handlers.TimedRotatingFileHandler-> 時間に従ってログファイルを自動的に分割する
このハンドラーはRotatingFileHandlerに似ていますが、ファイルサイズを判断してログファイルをいつ再作成するかは決定しませんが、一定の間隔で新しいログファイルを自動的に作成します。名前の変更プロセスはRotatingFileHandlerに似ていますが、新しいファイルには数字が追加されず、現在の時間が追加されます。そのコンストラクターは次の
とおりです。TimedRotatingFileHandler(filename [、when [、interval [、backupCount]]])
ここで、filenameパラメーターとbackupCountパラメーターは、RotatingFileHandlerと同じ意味を持っています。
intervalは時間間隔です。
パラメータが文字列の場合。時間間隔の単位では、大文字と小文字は区別されません。値は次のとおりです。毎秒
S秒
M分
H時間
D日
W(間隔== 0は月曜日を表す)
毎朝真夜中
設定方法:
setLevel()
メソッドはログオブジェクトの場合と同じで、ログが配布される最低レベルを示します。なぜ2つのsetLevel()
方法があるのですか?ロガーのレベルによって、メッセージがプロセッサに配信されるかどうかが決まります。各プロセッサのレベルによって、メッセージを配信するかどうかが決まります。setFormatter()
プロセッサーのフォーマッターを選択します。addFilter()
そして、removeFilter()
対象とキャンセルフィルタの設定ハンドラの上に配置されています。
フォーマッター
Formatterオブジェクトは、ログ情報の最終的なルール、構造、および内容を設定します。デフォルトの時間形式は、%Y-%m-%d%H:%M:%Sです。以下は、Formatterの一般的に使用される情報の一部です。
%(name)s |
ロガーの名前 |
%(levelno)s |
数値のログレベル |
%(レベル名)s |
テキストのログレベル |
%(パス名)s |
ログ出力関数を呼び出すモジュールの完全パス名は、 |
%(ファイル名)s |
ログ出力機能を呼び出すモジュールのファイル名 |
%(モジュール)s |
ログ出力関数を呼び出すモジュールの名前 |
%(funcName)s |
ログ出力関数を呼び出す関数名 |
%(lineno)d |
ログ出力関数を呼び出すステートメントが配置されているコード行 |
%(created)f |
UNIX標準で時刻を表す浮動小数点数として表される現在の時刻 |
%(relativeCreated)d |
ログ情報を出力するときのロガーの作成からのミリ秒数 |
%(asctime)s |
文字列としての現在の時刻。デフォルトの形式は「2003-07-08 16:49:45,896」です。コンマの後のミリ秒 |
%(thread)d |
スレッドID。おそらくない |
%(threadName)s |
スレッド名。おそらくない |
%(プロセス)d |
プロセスID。おそらくない |
%(メッセージ)s |
ユーザー出力メッセージ
|
要件:
ログをコンソールに出力し、ログをログファイルに書き込みます。
2種類のログを保存します。all.logはデバッグ、情報、警告、重要な情報を保存します。error.logはエラー情報のみを保存し、時間に従ってログファイルを自動的に分割します。
ロギングインポート ログインポートハンドラから クラスロガー(オブジェクト): level_relations = { 'デバッグ':logging.DEBUG、 '情報':logging.info、 '警告':logging.WARNING、 'エラー':logging.error、 'クリティカル' :logging.CRITICAL } #ログレベルリレーションシップマッピングdef __init __(self、filename、level = 'info'、when = 'D'、backCount = 3、fmt = '%(asctime)s-%(pathname)s(line: %(lineno)d]-%(levelname)s:%(message)s '): self.logger = logging.getLogger(filename) format_str = logging.Formatter(fmt) #ログの形式self.logger.setLevel(self .level_relations.get(level))#ログレベルを設定します sh = logging.StreamHandler()#画面に出力 sh.setFormatter(format_str )#画面に表示されるフォーマットを設定します th = handlers.TimedRotatingFileHandler(filename = filename、when = when、backupCount = backCount、encoding = 'utf-8')#ファイルに書き込む#インターバル時間を自動的に指定ファイルを生成したプロセッサ #instantiated TimedRotatingFileHandler #intervalは時間間隔、backupCountはバックアップファイルの数、この数を超えると自動的に削除されます。間隔時間の単位である場合、単位には次のタイプがあります:#S 秒 #Mサブ #H-時間、 #のD-日、 週#のW(間隔== 0代わっ月曜日) #ミッドナイト毎朝 th.setFormatter(format_str)#セットファイル書かれたフォーマット self.logger.addHandler(SH ) #オブジェクトをロガーに追加しますself.logger.addHandler(th) if __name__ == '__main__' :log = Logger( 'all.log'、level = 'debug') log.logger.debug( 'debug') log.logger.info( 'info') log.logger.warning( 'Warning') log.logger.error( '报错') log.logger.critical( '严重') Logger( 'error.log'、level = 'error')。logger.error( 'error')
画面の結果は次のとおりです。
2018-03-13 21:06:46,092-D:/write_to_log.py [line:25]-DEBUG:debug 2018-03-13 21:06:46,092-D:/write_to_log.py [line:26]-INFO :情報 2018-03-13 21:06:46,092-D:/write_to_log.py [line:27]-警告:警告 2018-03-13 21:06:46,099-D:/write_to_log.py [line:28] -エラー:报错 2018-03-13 21:06:46,099-D:/write_to_log.py [line:29]- クリティカル:严重2018-03-13 21:06:46,100-D:/write_to_log.py [line: 30]-エラー:エラー
when = Dなので、以下に示すように、新しく生成されたファイル名には時間がかかります。