pythonでログのファイル出力とコンソール出力を両方できるようにする。 mshmura

## 目的
- ファイル出力とコンソール出力の両方のログを出力できるようにする。
- ファイル出力については、エラーレベル以上のみ出力されたファイルも作る。

## 注意点
ログについては最近勉強を始めたばかりなので、ここ少しおかしいなとか、もっと効率的に書けるなというところがあれば、コメントいただければ幸いです。

## ライブラリのインポート
```
from logging import ERROR, Formatter, getLogger, StreamHandler,FileHandler,DEBUG
```
## ログの出力形式を設定
```
formatter=Formatter('[%(levelname)s] %(asctime)s - %(message)s(%(filename)s)')
logger = getLogger(__name__)
```
## コンソール表示用ハンドラーの生成
```
stream_handler = StreamHandler()
```
## テキストファイル出力用ハンドラーの生成
デバッグレベルとエラーレベルに分ける。

```
file_handler = FileHandler('log.txt')
error_handler = FileHandler('log_error.txt')
```

## 各ハンドラーのレベルとフォーマットの設定
```
stream_handler.setLevel(ERROR)
stream_handler.setFormatter(formatter)
file_handler.setLevel(DEBUG)
file_handler.setFormatter(formatter)
error_handler.setLevel(ERROR)
error_handler.setFormatter(formatter)
```
## ロガーのレベル設定とハンドラー追加
```
logger.setLevel(DEBUG)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
logger.addHandler(error_handler)
```

## 実行ファイル

test_funcという関数内で、文字列＋数字をしてエラーを発生させる。

``` log_practice.py
## ファイル出力とコンソール出力の両方のログを出力できるようにする。
## ファイル出力については、更にエラーのみの出力ファイルに分ける。

from logging import ERROR, Formatter, getLogger, StreamHandler,FileHandler,DEBUG
## ログの出力形式を設定
formatter=Formatter('[%(levelname)s] %(asctime)s - %(message)s(%(filename)s)')
logger = getLogger(__name__)

## コンソール表示用
stream_handler = StreamHandler()
## テキスト出力用
file_handler = FileHandler('log.txt')
error_handler = FileHandler('log_error.txt')

## レベルと形式の設定
stream_handler.setLevel(ERROR)
stream_handler.setFormatter(formatter)

file_handler.setLevel(DEBUG)
file_handler.setFormatter(formatter)

error_handler.setLevel(ERROR)
error_handler.setFormatter(formatter)

logger.setLevel(DEBUG)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
logger.addHandler(error_handler)

logger.debug('ロギング 開始')

def test_func(num):
    return num + 3
try:
    test_func("ss")
except Exception as e:
    logger.exception("test_func関数にてエラー発生。エラー内容は下記のとおり。")

logger.debug('ロギング 終了')
```
## コンソール出力画面
```
[ERROR] 2021-12-04 22:01:43,877 - test_func関数にてエラー発生。エラー内容は下記のとおり。(logpractice.py)
Traceback (most recent call last):
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 35, in <module>
    test_func("ss")
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 33, in test_func
    return num + 3
TypeError: can only concatenate str (not "int") to str
```
## ファイル出力

デバッグレベル以上を出力したファイル

``` log.txt
[DEBUG] 2021-12-04 22:01:43,876 - ロギング 開始(logpractice.py)
[ERROR] 2021-12-04 22:01:43,877 - test_func関数にてエラー発生。エラー内容は下記のとおり。(logpractice.py)
Traceback (most recent call last):
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 35, in <module>
    test_func("ss")
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 33, in test_func
    return num + 3
TypeError: can only concatenate str (not "int") to str
[DEBUG] 2021-12-04 22:01:43,881 - ロギング 終了(logpractice.py)
```

エラーレベル以上を出力したファイル

``` log_error.txt
[ERROR] 2021-12-04 22:01:43,877 - test_func関数にてエラー発生。エラー内容は下記のとおり。(logpractice.py)
Traceback (most recent call last):
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 35, in <module>
    test_func("ss")
  File "c:\Users\addre\dev\log_practice\logpractice.py", line 33, in test_func
    return num + 3
TypeError: can only concatenate str (not "int") to str
```