ログ出力で使われるloggingを超簡単にまとめました。色々と詰め込みたいところですが、それを放棄して分かり易さを重点をおいています。このページに網羅性とかありません。詳細は、公式サイトを見ることをお勧めします。
ここでは、ノーマルな使い方を元に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()
コメント