St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

【Python】loggingを複数ファイル・モジュール間で使う方法

こんにちは。

今日は、loggingを複数ファイル・モジュール間で使う方法について調べたので、そのメモを書きます。ログの設定については下記に書いたので、今回は複数ファイル・モジュール間で使う方法についてだけ描きます。

st-hakky.hatenablog.com

やり方

公式ドキュメントに書いてあります。

基本的に、 logging.getLogger('someLogger')のような感じでloggerを定義して、複数ファイルやモジュールで複数回同じように呼び出せば、同じ参照先を返すので、特に考える必要がありません。

具体的には、以下のような感じです。

main.py
# coding:utf-8
from logging import getLogger, StreamHandler, DEBUG, Formatter, FileHandler

logger = getLogger('Log')
handler = StreamHandler()

logger.setLevel(DEBUG)
handler.setLevel(DEBUG)
formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

fh = FileHandler(filename='log.txt')
fh.setLevel(DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)

# 別ファイルの参照
import sub

logger.debug("Hello main")

# 別ファイルのsub.pyのログ
sub.log()
sub.py
# coding:utf-8

# ログのライブラリ
from logging import getLogger

# main.pyで宣言したloggerの子loggerオブジェクトの宣言
logger = getLogger("Log").getChild("sub")

def log():
    logger.debug("Hello sub")
main.py を実行

実行すると、以下の出力がlog.txtに出てきます。

2018-07-31 01:48:44,504 - Log - DEBUG - Hello main
2018-07-31 01:48:44,504 - Log.sub - DEBUG - Hello sub

このような形で複数モジュール間で、log出力を受け継ぐことができます。

まとめ

宣言時の logging.getLogger('someLogger') の部分で、 'someLogger' を複数モジュール間で同じく宣言すれば、同じPythonインタプリタプロセス上で動いている限り、複数モジュール間で跨いで使うことができます。

本日は以上。それでは。