【Python】LoggingとLoggerの使い方を簡潔にまとめました

ログ出力で使われるloggingを超簡単にまとめました。色々と詰め込みたいところですが、それを放棄して分かり易さを重点をおいています。このページに網羅性とかありません。詳細は、公式サイトを見ることをお勧めします。

ここでは、ノーマルな使い方を元にloggingとloggerの関係をまとめ、ログ出力のサンプルを置いておきました。

よく使われているライブラリにおけるloggingとloggerの使われ方

下図は、ノーマルなloggingとloggerの使われ方の概略です。

loggingとloggerの概念図

ざっくりまとめると、
loggerの役割は、モジュール(FooA.py FooB.py)からログメッセージを受け取り、指定された出力先(標準出力やログファイル)に、そのログメッセージを送ることです。
loggingは、loggerとメッセージの送り先を結びつけます。

通常、各モジュール内にloggerのインスタンスがあり、モジュール内においては、そのインスタンスに対してログメッセージを送っています。

loggerのインスタンスに、ログメッセージを送るサンプル

PC内に入っているライブラリに対して、キーワード”logger”でgrepを掛けると、次のようなソースが見つかります。これが通常の書かれ方です。

FooA.py

import logging

logger = logging.getLogger(__name__)

def func() -> None:
    ...
    logger.info("情報")
    ...
    logger.error("エラー")
    ...

上のサンプルでは、__name__つまり、FooAが識別子になります。loggingは、この識別子を通じて、ログメッセージの出力先を設定します。

loggingで、ログメッセージの出力先を設定するサンプル

最も単純なサンプルです。モジュール内のログメッセージをログファイルに入れるように設定しています。

import logging
import FooA

logging.basicConfig()

# FooA.py ログファイルに出力する設定
file_sh = logging.FileHandler('.\\debug.log')
logger = logging.getLogger("FooA")
logger.addHandler(file_sh)

FooA.func()

走らせると、コンソールとログファイル(debug.log)に、出力されていると思います。

情報
エラー

loggerインスタンスをコントロールするために使われる識別子は、モジュール名

出力できるのは、ログメッセージを受け取るモジュール内のloggerのインスタンスです。そのインスタンスを特定し、インスタンスに出力先を設定しなければなりません。インスタンスの特定に識別子に用いますが、通常モジュール名(FooA)が使われます。

ログ出力のサンプル

下のサンプルは、モジュールFooA,FooB内で、それぞれがloggerにログメッセージを送っています。
両モジュール共にログメッセージが標準出力され、FuncAの方はdebug.logに出力しています。

FooA.py

import logging

logger = logging.getLogger(__name__)


def func() -> None:
    logger.info("情報")
    logger.error("エラー")

FooB.py

import logging
logger = logging.getLogger(__name__)

def func() -> None:
    logger.info("情報")
    logger.warning("警告")
    logger.error("エラー")
logging_format = "%(asctime)s\t%(levelname)s\t%(name)s\t%(filename)s\t%(funcName)s\t%(lineno)d\t%(message)s"

#   標準出力のフォーマットは、loggingで設定
logging.basicConfig(format=logging_format)

#   ログファイルに出力するHandlerの設定
file_sh = logging.FileHandler('.\\debug.log')
file_sh.setFormatter(logging.Formatter(logging_format))

# FooA.py 標準出力とログファイル出力 デバッグ以上のログを出力
logger = logging.getLogger("FooA")
logger.setLevel(level=logging.DEBUG)
logger.addHandler(file_sh)

# FooB.py WARNING以上を標準出力
logger = logging.getLogger("FooB")
logger.setLevel(level=logging.WARNING)

# Selenium
logger = logging.getLogger('selenium.webdriver.remote.remote_connection')
logger.setLevel(level=logging.WARNING)
logger.addHandler(file_sh)

FooA.func()
FooB.func()

コメント

タイトルとURLをコピーしました