目次
1. ログの役割
一般的なプログラム ログは、次の要件に基づいて作成されます。
1. ユーザー操作の監査ログを記録します。これは、規制部門の要件となる場合もあります。
2. 問題の原因を迅速に特定します。
3. プログラムの実行プロセスを追跡します。
4. データ変更の追跡
5. データ統計とパフォーマンス分析
6. 動作環境データの収集
一般に、プログラムがオンラインになった後、例外が発生すると、最初に行うことは、その時点で何が起こったのかを把握することです。そのときにユーザーがどのような操作を行ったのか、環境に影響はあったのか、データにどのような変化があったのか、繰り返し発生したのかなどを分析し、問題のどの側面に問題があるのかをさらに判断します。プログラムの問題であると判断された後は、開発者に引き渡され、再現、調査、解決策の提案が行われます。現時点では、ログは私たちに直接の情報を提供します。
2. ログレベル
1. DEBUG レベルは
、主にアプリケーションのデバッグに使用される、きめの細かい情報イベントを示します。
2. INFO レベルは
、特定の支店に入るなど、アプリケーションの実行プロセスを強調する粗いレベルを示します。
3. WARN レベルは、
潜在的なエラーを示します。
4. ERROR レベルは、
エラー イベントが発生しても、システムの継続的な動作に影響を与えないことを示します。
5.FATAL レベルは
、それぞれの重大なエラー イベントがアプリケーションの終了につながることを示します。
Log4j では、4 つのレベルのみを使用することをお勧めします。優先順位は高から低の順で、ERROR、WARN、INFO、DEBUG です。ロガーの現在設定されているレベル以上のログが出力されます。
優先順位は次のとおりです: DEBUG<INFO<WARNING<ERROR<CRITICAL
ログのデフォルトレベルは警告レベル以上であり、デバッグも情報もコンソールに出力されません。
3. いくつかの重要な概念
ロガー レコーダー: アプリケーション コードで使用するログ インターフェイスを提供します。
ハンドル プロセッサ: ログ レコード (ロガーによって生成される) の送信先、つまり出力先
フィルタ フィルタ: より詳細な制御を提供し、どのログ レコードを出力するかを決定でき、ログ レコードがハンドルに送信されるかどうかを判断するエレガントな方法を提供します。
Formatter フォーマッタ: ログ出力の特定の形式を指定します。
4、ロガーレコーダー
1。概要
これはツリー状の階層構造です。インターフェイス debug、info、warning、error、critical を使用する前に、Logger インスタンス、つまりロガーを作成する必要があります。明示的に作成しない場合は、ルート ロガーが作成されます。デフォルトで作成され、デフォルトが適用されます。ログ レベル (警告)、ハンドラー ハンドル (標準出力にログ情報を出力する StreamHandle)、およびフォーマッタ Formatter (デフォルトの形式は最初の単純な出力形式です)効用)。
作成されたメソッド: logger =logging.getLogger(logger_name)
ロガー オブジェクトは直接インスタンス化されることはなく、モジュール レベルの関数を通じてインスタンス化されます。
Logging.getLogger(name) はロガー インスタンスを作成します。logging.getLogger(name) 関数を呼び出すときに、渡された name パラメーターの値が同じであれば、常にロガー オブジェクト インスタンスのアプリケーションが返されます。
2. Logger インスタンスを作成した後、次の方法を使用してログ レベルを設定し、プロセッサ ハンドルを増やすことができます。
logger.setLevel(logging.ERROR) = ログ レベルを ERROR に設定します。つまり、ERROR 以上のログ レベルを持つログのみが出力されます (デフォルトのレベルは警告です)。
logger.addHandle(handle_name) = Logger インスタンスにハンドラーを追加します
logger.removeHandle(handle_name) = Logger インスタンスのハンドラーを削除します
5、ハンドルプロセッサー
1。概要
handle 指定した場所 (ファイル、ウィンドウ) にログ情報を送信します。
ハンドルプロセッサタイプ: StreamHandle、FileHandle、NullHandle
2、ストリームハンドル
作成方法:sh =logging.StreamHandle(stream==None)
ログ出力をコンソールに送信する
3、ファイルハンドル
StreamHandle の出力関数を継承するディスク ファイルにログ レコードを送信します。
作成方法:fh =logging.FileHandle(filename,mode='a',encoding=None,lay=False)
4、Nullハンドル
書式設定や出力は行わず、基本的に開発者が使用する「操作なし」ハンドラーです。
本質的には「何もしない」ハンドルで、ライブラリ開発者によって使用されます。
6、フォーマッタフォーマッター
1。概要
ログの出力形式を設定するために使用されます
作成方法:formatter =logging.Formatter(fmt=None, datefmt=None)、fmtとdatefmtを使用してログ形式と時刻形式を設定します。
デフォルトの形式: %(asctime)s-%(levelname)s-%(message)s
デフォルトの時刻形式: %Y-%m-%d %H:%M:%S
2. Formatter オブジェクトを使用して、ログ情報の最終的なルール、構造、内容を設定します。
7. 実際のテストケースへのログの適用
カプセル化クラスは、外部ファイルがログを呼び出すのに便利です。例は主にコンソール出力ログと外部 .log ファイルへのログ出力で完成します。
ログクラスをカプセル化する手順は次のとおりです。
ロガーを作成する
ハンドルを作成する
フォーマッタを作成する
ロガーを構成する
栗について:
1. プロジェクト ディレクトリにクラスの外部ログ ファイル test.log を作成します。
2. Logger クラスをカプセル化します。
# 日志综合案例的封装
import logging
class Logger():
def __init__(self, LoggerName, FileName, CmdLevel, FileLevel):
# LoggerName:实例化对象的名字 FileName:外部文件名 CmdLevel:设置控制台中日志输出的级别 FileLevel:设置文件日志输出的级别
self.logger = logging.getLogger(LoggerName)
# 设置日志的级别
self.logger.setLevel(logging.DEBUG)
# 设置日志的输出格式
fmt = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
# 借助handle将日志输出到test.log文件中
fh = logging.FileHandler(FileName)
fh.setLevel(FileLevel)
# 借助handle将日志输出到控制台
ch = logging.StreamHandler()
ch.setLevel(CmdLevel)
# 配置logger
fh.setFormatter(fmt)
ch.setFormatter(fmt)
# 给logger添加handle
self.logger.addHandler(fh)
self.logger.addHandler(ch)
def debug(self,message):
self.logger.debug(message)
def info(self,message):
self.logger.info(message)
def warn(self,message):
self.logger.warning(message)
def error(self,message):
self.logger.error(message)
def critical(self,message):
self.logger.critical(message)
# 如下为测试代码,实际运行中可以注释掉
if __name__ == "__main__":
logger = Logger("appium","test.log",CmdLevel=logging.DEBUG,FileLevel=logging.INFO)
logger.debug("debug message!")
logger.info("info message!")
logger.warn("warning message!")
logger.error("error message!")
logger.critical("critical message!")
3. Logger クラスを呼び出します。
Logger クラスのインスタンス化されたオブジェクトをクラスの外に作成し、必要なパラメータを渡します。
# 其他类中调用Loger类
# 实例化Logger类,并传入参数
logger = Logger("appium", "test.log", CmdLevel=logging.DEBUG, FileLevel=logging.INFO)
class Test:
logger.debug("debug message!")
logger.info("info message!")
logger.warn("warning message!")
logger.error("error message!")
logger.critical("critical message!")
4. 出力結果:
控制台:
2020-09-10 10:32:46,230-appium-DEBUG-debug message!
2020-09-10 10:32:46,230-appium-INFO-info message!
2020-09-10 10:32:46,230-appium-WARNING-warning message!
2020-09-10 10:32:46,230-appium-ERROR-error message!
2020-09-10 10:32:46,230-appium-CRITICAL-critical message!
外部文件:
20-09-10 10:32:46,230-appium-INFO-info message!
2020-09-10 10:32:46,230-appium-WARNING-warning message!
2020-09-10 10:32:46,230-appium-ERROR-error message!
2020-09-10 10:32:46,230-appium-CRITICAL-critical message