概要
Pythonの自作モジュールを作成した場合、logをどのように出力したらよいのか、サンプルを作りました。
処理内容
sample.pyというモジュールを、main.pyから呼び出します。sample.py内でlog出力の処理を書きますが、main.pyでroot loggerが作られていないと、モジュール内のloggerは何も出力しないという挙動になります。
ハンズオン
モジュールを作成
モジュール内を作成します。log出力の処理を書きます。
sample.py
# -*- coding:utf-8 -*-
from logging import getLogger, DEBUG, NullHandler
class Sample:
def __init__(self):
self._logger = getLogger(__name__)
self._logger.addHandler(NullHandler())
self._logger.setLevel(DEBUG)
self._logger.propagate = True
def main(self):
self._logger.debug('Debug')
self._logger.info('Info')
self._logger.warn('Warn')
self._logger.error('Error')
root loggerを作成
main.pyで利用するためのroot loggerの定義を、my_logger.pyというファイル名で作成します。
(main.py内に以下の定義をしてもよいですが、別ファイルにしました。)
my_logger.py
# -*- coding:utf-8 -*-
from logging import Formatter, handlers, StreamHandler, getLogger, DEBUG
def root_logger():
# root loggerを取得
logger = getLogger()
# formatterを作成
formatter = Formatter('%(asctime)s %(name)s %(funcName)s [%(levelname)s]: %(message)s')
# handlerを作成しフォーマッターを設定
handler = StreamHandler()
handler.setFormatter(formatter)
# loggerにhandlerを設定、イベント捕捉のためのレベルを設定
logger.addHandler(handler)
# log levelを設定
logger.setLevel(DEBUG)
return logger
main.pyを作成
Sampleモジュールを呼び出すmain.pyを作成します。
以下のコメントアウトにもあるように、先程作成したmy_logger.pyを呼び出しroot loggerを作成します。
main.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import my_logger
import sample
from logging import Formatter, handlers, StreamHandler, getLogger, INFO
if __name__ == '__main__':
# root loggerを作成
logger = my_logger.root_logger()
logger.info('The root logger is created.')
# モジュール呼び出し
sample = sample.Sample()
sample.main()
実行
main.pyを実行すると、以下のようにログが出力されます。
$ python main.py
2020-02-17 14:01:21,721 root <module> [INFO]: The root logger is created.
2020-02-17 14:01:21,721 sample main [DEBUG]: Debug
2020-02-17 14:01:21,721 sample main [INFO]: Info
2020-02-17 14:01:21,721 sample main [WARNING]: Warn
2020-02-17 14:01:21,721 sample main [ERROR]: Error
root loggerを作成しない場合
root loggerを作成しない場合の挙動を確認します。
main.pyを修正
main.pyのroot loggerを作成する部分をコメントアウトします。
main.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import my_logger
import sample
from logging import Formatter, handlers, StreamHandler, getLogger, INFO
if __name__ == '__main__':
# 以下をコメントアウトする。
# logger = my_logger.root_logger()
# logger.info('The root logger is created.')
# モジュール呼び出し
sample = sample.Sample()
sample.main()
実行
main.pyを実行しても、何も出力されません。
$ python main.py
以上