Python でファイルとコンソールにメッセージを記録する

Subodh Adhikari 2023年10月10日
  1. Python で logging モジュールを使用してログメッセージをファイルとコンソールに出力する
  2. Python で logging モジュールを使用してログメッセージをコンソールに出力する
  3. Python で logging モジュールを使用してログメッセージをファイルに出力する
Python でファイルとコンソールにメッセージを記録する

このチュートリアルでは、Python でデバッグ文字列をファイルとコンソールに記録するいくつかの方法を紹介します。

Python で logging モジュールを使用してログメッセージをファイルとコンソールに出力する

ロギングは、システムで発生するさまざまなイベントの記録を保持するプロセスです。これらのイベントには、入力データ、プロセス、スレッド、出力データ、処理された情報、エラー、警告、通知などがあります。さまざまなイベントが追跡され、ログファイルに保存されます。logging モジュールは、プログラマーが発生したさまざまなイベントをログに記録するのを容易にする Python によって提供されます。モジュールには特定のクラスとメソッドがあります。LoggersHandlersFilters および Formatters は、logging モジュールが定義する基本的なクラスです。

basicConfig() メソッドは基本構成を実行します。デフォルトのフォーマッターを使用して StreamHandler を作成します。次に、ルートロガーに追加します。ロギングレベルは数値で表されます。ロギングレベルには、CRITICALERRORWARNINGINFODEBUG、および NOTSET の 6つがあります。以下のログレベルを INFO に設定しました。したがって、INFOWARNINGERROR、および 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

関連記事 - Python Logging