Python logging モジュールの使用を開始するための最低限の知識

# Python logging モジュールの使用を開始するための最低限の知識

この記事では、最小限の知識でアプリ開発のPythonロギングモジュールを開始する方法について説明します。
すぐに開発で使える最小限の知識だけをまとめていますので足りない情報は補いつつ、スタート地点として利用していただければと思います。


##loggingの基本機能

print文のようなものです（でも、これではloggingの意味がないのでこんな風に使わないでくださいね。）

```python：logging-example
import logging
logging.warning（ 'Watch out！'）＃コンソールにメッセージを出力します
logging.info（ 'I said so'）＃defaultのlog levelではwarningなので、コンソールには何も出力されないはずです
```

## アプリ開発でloggingを使用するための必要最低限の知識と設定

### logger

* logger object
  * 使用するロガーを設定
  * ログレベルを設定（DEBUG、WARNINGなど）
  * ログをコンソールまたはファイルのどちらに送信するかを決定（StreamHandler、TimedRotatingFileHandlerなどのハンドラーを使用します）

* logger = logging.getLogger（ 'app'）

  * ロガーオブジェクトを構築
  * ロガーはappという名前

## loggingを使用するためのテンプレート

* この例では次のような2つのファイルを配置すると仮定します

```bash：structure_in_this_example
root
├──your_app.py
├──logging.conf
└──logging_dev.conf
```

* 理想的には、これらのconfファイルはおそらく以下のような別のディレクトリに設定する必要があります

```bash：ideal_directory_structure
root
├──app
│└──your_app.py
└──conf
    ├──logging.conf
    └──logging_dev.conf
```

* 次のテンプレートを使用して、開発環境でロギングを実行し、以下のconfファイルの例を組み合わせて使用​​できます。

```python:your_app.py
import logging

# read the conf file
logging.config.fileConfig('logging_dev.conf', disable_existing_loggers=False)

# create logger
logger = logging.getLogger('app')

def main():
    try:
        1/0  # ZeroDivisionError
        # your code goes here   
    except Exception as e:
        logger.exception(e.args)


if __name__ == '__main__':
    main()
```

## logging 設定ファイル

### ポイント

* log levelはdevとproductionの両方で適切に設定しましょう。
* ファイルハンドラは、RotatingFileHandlerとTimedRotatingFileHandlerの間で選択する必要があります。

###運用設定ファイルのサンプル（ログレベルがINFOであることに注意）

```ini:logging-prod.conf
[loggers]
keys=root,app

[formatters]
keys=default

[handlers]
keys=frotate,default

[formatter_default]
format=%(asctime)s %(levelname)s %(message)s
datefmt=%Y/%m/%d %H:%M:%S

[handler_frotate]
class=handlers.TimedRotatingFileHandler
formatter=default
args=('logs/logger.log', 'W0', 1, 100)

[handler_default]
class=StreamHandler
formatter=default
args=(sys.stdout,)

[logger_app]
level=INFO
handlers=frotate
qualname=app

[logger_root]
level=INFO
handlers=default
```

### dev configファイルのサンプル（ログレベルがNOTSETであり、DEBUGよりもノイズが多いことに注意）

```ini:logging-dev.conf

[loggers]
keys=root,app

[formatters]
keys=default

[handlers]
keys=frotate,default

[formatter_default]
format=%(asctime)s %(levelname)s %(message)s
datefmt=%Y/%m/%d %H:%M:%S

[handler_frotate]
class=handlers.TimedRotatingFileHandler
formatter=default
args=('logs/logger_dev.log', 'W0', 1, 100)

[handler_default]
class=StreamHandler
formatter=default
args=(sys.stdout,)

[logger_app]
level=NOTSET
handlers=frotate
qualname=app

[logger_root]
level=NOTSET
handlers=default
```

## まとめ

ロギングモジュールの最小限の使用方法をざっと紹介しました。
詳細を知る必要がある場合は、[参照](#参照) で紹介しているドキュメントなどをみてみてください。

## 参照

* [Logging configuration](https://docs.python.org/3/library/logging.config.html)
* [Logging How To](https://docs.python.org/3/howto/logging.html)
* [Good logging practice in Python](https://fangpenlin.com/posts/2012/08/26/good-logging-practice-in-python/)
* [Pythonのロギングについてお勉強したメモ](https://note.crohaco.net/2014/python-logging/)
* [ロギング設定をファイルから読み込むときの注意点](https://blog.amedama.jp/entry/2018/04/12/233903)