YAML書式で記述した logging の設定ファイルの読み込み

# 本日は

[基本 logging チュートリアル](https://docs.python.jp/3/howto/logging.html#logging-advanced-tutorial)

"ロギングの環境設定"においてloggingの設定方法をYAMLで記述したものを読み込むための方法の実装例をみていきませう。

## 設定ファイルによるもの

チュートリアルから抜粋します。
ただし、datefmt は欠損していたようなので私のほうで捕捉しています。

### logging.conf

```conf
#logging.conf
[loggers]
keys=root,simpleExample

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt='%m/%d/%Y %I:%M:%S %p'
```
### log_conf.py

```py3
#log_conf.py
import logging
import logging.config

logging.config.fileConfig('logging.conf')

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

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
```

## 実行例 (on Windows)

```shell-session

> python log_conf.py
'09/26/2017 10:29:59 AM' - simpleExample - DEBUG - debug message
'09/26/2017 10:29:59 AM' - simpleExample - INFO - info message
'09/26/2017 10:29:59 AM' - simpleExample - WARNING - warn message
'09/26/2017 10:29:59 AM' - simpleExample - ERROR - error message
'09/26/2017 10:29:59 AM' - simpleExample - CRITICAL - critical message
```

## YAML から読み込む

チュートリアルから抜粋します。　YAMLは次のように記述できるようです。

### tutorial.yaml

```yaml
version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
    stream: ext://sys.stdout
loggers:
  simpleExample:
    level: DEBUG
    handlers: [console]
    propagate: no
root:
  level: DEBUG
  handlers: [console]
```

問題はこれをどうやって読み込むの？って話です。
[Flaskでloggingの設定を外部ファイルから読み込む](https://qiita.com/petitviolet/items/86a3cc74d35fd9f6c96c)
を参考に

```py3
logging.config.dictConfig(yaml.load(open("config.yaml").read()))
```

のように記述すればよいみたいです。
ただし、yaml モジュールは外部ライブラリなのでMinicondaであれば次のようにして導入します。

```shell-session
> conda install pyyaml
```
`import` するときは

```py3
import yaml
```
と宣言します。


### 実装例(log_yaml.py)

```py3
#log_yaml.py
import logging
import logging.config
import yaml  # conda install pyyaml

def main():
    logging.config.dictConfig(yaml.load(open("tutorial.yaml").read()))
    # create logger
    logger = logging.getLogger('simpleExample')
    # 'application' code
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')

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

### 実行例(on Windows)

```shell-session
>python log_conf.py
'09/26/2017 10:41:20 AM' - simpleExample - DEBUG - debug message
'09/26/2017 10:41:20 AM' - simpleExample - INFO - info message
'09/26/2017 10:41:20 AM' - simpleExample - WARNING - warn message
'09/26/2017 10:41:20 AM' - simpleExample - ERROR - error message
'09/26/2017 10:41:20 AM' - simpleExample - CRITICAL - critical message
```

# Reference
[基本 logging チュートリアル](https://docs.python.jp/3/howto/logging.html#logging-advanced-tutorial)
[Flaskでloggingの設定を外部ファイルから読み込む](https://qiita.com/petitviolet/items/86a3cc74d35fd9f6c96c)