Python でファイルとコンソールにメッセージを記録する
-
Python で
logging
モジュールを使用してログメッセージをファイルとコンソールに出力する -
Python で
logging
モジュールを使用してログメッセージをコンソールに出力する -
Python で
logging
モジュールを使用してログメッセージをファイルに出力する
このチュートリアルでは、Python でデバッグ文字列をファイルとコンソールに記録するいくつかの方法を紹介します。
Python で logging
モジュールを使用してログメッセージをファイルとコンソールに出力する
ロギングは、システムで発生するさまざまなイベントの記録を保持するプロセスです。これらのイベントには、入力データ、プロセス、スレッド、出力データ、処理された情報、エラー、警告、通知などがあります。さまざまなイベントが追跡され、ログファイルに保存されます。logging
モジュールは、プログラマーが発生したさまざまなイベントをログに記録するのを容易にする Python によって提供されます。モジュールには特定のクラスとメソッドがあります。Loggers
、Handlers
、Filters
および Formatters
は、logging
モジュールが定義する基本的なクラスです。
basicConfig()
メソッドは基本構成を実行します。デフォルトのフォーマッター
を使用して StreamHandler
を作成します。次に、ルートロガーに追加します。ロギングレベルは数値で表されます。ロギングレベルには、CRITICAL
、ERROR
、WARNING
、INFO
、DEBUG
、および NOTSET
の 6つがあります。以下のログレベルを INFO
に設定しました。したがって、INFO
、WARNING
、ERROR
、および CRITICAL
が表示または保存されます。
コンソールとファイルに書き込むには、logging.basicConfig()
を使用します。これにより、引数ハンドラーを取得し、特に同じフォーマッターで複数のハンドラーを設定する場合に、ログの設定を大幅に簡素化できます。FileHandler()
メソッドを使用してファイルに書き込み、debug.log
を使用してすべての情報をログに記録します。同様に、コンソールに書き込むには、StreamHandler()
を使用します。デフォルトでは、StreamHandler()
は stderr に書き込みます。stdout に書き込むには、sys
モジュールをインポートし、sys.stdout
を明示的に StreamHandler()
に渡します。
以下の例では、ログはコンソールとファイル debug.log
に出力されます。
# python 3.x
import logging
import sys
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[logging.FileHandler("debug.log"), logging.StreamHandler(sys.stdout)],
)
logging.debug("This message is skipped as a level is set as INFO")
logging.info("So should this")
logging.warning("And this, too")
logging.error("Testing non-ASCII character, Ø and ö")
出力:
2021-07-28 14:50:01,348 [INFO] So should this
2021-07-28 14:50:01,349 [WARNING] And this, too
2021-07-28 14:50:01,349 [ERROR] Testing non-ASCII character, Ø and ö
Python で logging
モジュールを使用してログメッセージをコンソールに出力する
ロギングを使用して基本構成をセットアップするには、logging.basicConfig()
を使用します。次に、print()
の代わりに、logging.{level}(message)
を呼び出し、コンソールにメッセージを表示します。basicConfig()
設定でレベルを INFO として構成したため、プログラムの後半で logging.info()
を呼び出しました。そして、文字列内のメッセージ全体が logging.info()
に渡され、コンソールに表示されます。
サンプルコード:
# python 3.x
import logging
logging.basicConfig(level=logging.INFO)
def area(l, b):
"""Compute the area of a rectangle"""
return l * b
logging.info(
"Area of length: {l} and breadth: {b} is {c}".format(l=3, b=4, c=area(l=3, b=4))
)
出力:
INFO:root:Area of length: 3 and breadth: 4 is 12
Python で logging
モジュールを使用してログメッセージをファイルに出力する
プログラムで複数のモジュールを使用している場合、ルートモジュールの使用には厳しい制限があります。そのため、logger.getLogger(name)
メソッドを使用して新しいロガーを作成する必要があります。
ロガーの名前として __name__
変数を使用する規則があります。新しいロガーを作成したら、ルートの logging.info()
メソッドではなく、新しい logger.info()
を使用してすべてのメッセージをログに記録することを忘れないでください。FileHandler()
は、カスタムロガーを別のファイルにログインさせるために使用されます。ここでは、情報を logfile.log
に記録しました。同様に、Formatter()
は、ログに記録されたメッセージの形式を変更するために使用されます。また、Formatter
は、ロガーに直接設定されるのではなく、FileHandler
オブジェクトに設定されます。
たとえば、getLogger()
を使用してロガーを作成または取得します。次に、setLogger()
メソッドを使用してログレベルを設定します。レベルを logging.WARNING
に設定します。次に、FileHandler()
メソッドを使用してハンドラーを定義し、Formatter()
メソッドを使用してフォーマッターを設定します。次に、addHandler()
メソッドを使用して、ハンドラーをロガーに追加します。最後に、テストするメッセージをいくつか記述します。ファイル log_file.log
でログを確認できます。
サンプルコード:
# python 3.x
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
handler = logging.FileHandler("log_file.log")
formatter = logging.Formatter(
"%(asctime)s : %(name)s : %(funcName)s : %(levelname)s : %(message)s"
)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug("A debug message")
logger.info("An info message")
logger.warning("There is something wrong")
logger.error("An error has happened.")
logger.critical("Fatal error occured. Cannot continue")
出力:
2021-07-30 11:55:31,047 : __main__ : <module> : WARNING : There is something wrong
2021-07-30 11:55:31,047 : __main__ : <module> : ERROR : An error has happened.
2021-07-30 11:55:31,047 : __main__ : <module> : CRITICAL : Fatal error occured. Cannot continue