15
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】自作モジュール内でloggingする

Last updated at Posted at 2020-02-17

概要

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

以上

参考

15
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?