Pythonロギングを（主に自分が）快適になるDeloggerプラグイン

Pythonでログ出力する際に何を使っていますか、printでしょうか。それともloggingでしょうか。（デジャブ）

前日のアドベントカレンダー[Pythonのログ出力にlogzeroを使う](https://www.kumilog.net/entry/python-logzero)
と続けてまさかの2日連続のロギング会です！

自作パッケージ[Delogger](https://github.com/deresmos/delogger)とは、主に自分がロギング処理を楽にするために作成しました。
なんと、Python3.4以上のバージョンしか対応してません！
3.5以上にしたかった（Type Hints使ってみたかった）ですが、なんとなくの理由で3.4以上（最低限pathlib使いたかった）にしました。

## Delogger
- 安直に、Debug loggerという意味！
- 手軽に（自分が）よく使うロギングを設定してくれるパッケージ！
- カラーでストリーム！ログファイル生成！時にはSlack通知！
- 様々な設定値ですが、クラス変数だと全ロガー共通設定に。インスタンス変数だとそのロガー限定の設定となります！


### 利用例

```python
from delogger import Delogger

delogger = Delogger(name='test_logger') # nameなくても問題ないです。
logger = delogger.logger

logger.info('Start logging')
logger.debug('debug')
logger.warning('warning')
logger.info('End logging')
```
![48709824-fad79400-ec49-11e8-8a93-a5c72bdec5fc.png](https://qiita-image-store.s3.amazonaws.com/0/218282/4b59c836-5473-55c1-e3ef-1f3db35aea72.png "normal-logger-demo")

こんな感じに表示されます。INFOレベルはそのまま表示です。
WARNING以上は、詳細を表示させています。
*※WARNがなんで明るい緑？私のターミナル色弱だったのか？*


## ロガーいろいろ

### ストリーム
- 通常は、INFOレベル以上の出力。`is_debug_stream = True`の場合は、DEGUGレベル以上の出力にしています。
- 通常状態では、WARNING以上に詳細を表示させるようにしました。
- 出力は色を付けて見やすくするために、手軽にパッケージ[colorlog](https://pypi.org/project/colorlog/)を利用しました。（今後は自分で実装、さらに見やすいようにカラー部分増やしたいと考え中）
- `Delogger.is_stream = False`とすることでストリームへの出力を無くす。
- ↓`is_debug_stream = True`時の出力例
![debug-demo](https://qiita-image-store.s3.amazonaws.com/0/218282/055cc5cf-d9aa-da74-0e2a-65278acf7f8d.png "debug-demo")


### ログファイル
- 基本的に実行単位でログを保存したかったのでハンドラー作りました。
- デフォルトのログファイルが、`2018-12-09 07:00:00.log`のようなファイル名なので、
　ほぼ実行単位での保存になります。
- `Delogger.filepath = '%Y/%m-%d.log'`のように設定すればできます。年別にディレクトリ作り、日毎にログ残せます！[利用できる書式文字](https://docs.python.jp/3/library/datetime.html#strftime-and-strptime-behavior)）

```python
from delogger import Delogger

Delogger.is_save_file = True
delogger = Delogger(name='test_logger', filepath='%Y/%m%d.log')
logger = delogger.logger

logger.info('Start logging')
logger.debug('debug')
logger.warning('warning')
logger.info('End logging')
```

![logfile-demo](https://qiita-image-store.s3.amazonaws.com/0/218282/ef29689f-b3c6-711e-b533-bff53dcacea5.png "logfile-demo")



### Slack通知
- Slackにて通知させたいときがあります。以下サンプルです。

```python
from delogger import Delogger, SlackHandler

delogger = Delogger(name='test_logger')
slack_hdlr = SlackHandler(token='SLACK_TOKEN', channel='#test_channel')
delogger.add_handler(slack_hdlr, Delogger.INFO, only_level=True)
logger = delogger.logger

logger.info('Start logging')
logger.debug('debug')
logger.warning('warning')
logger.info('End logging')
```

`only_level = True`にすることによって、INFOレベルのみをSlack通知するようにしてます。
今後、INFOレベルだがSlack飛ばしたくないとか、このメッセージは飛ばしたいとか実装したいと思ってます。

### キュー
- ロギング処理をいれると些細なものですが、その分処理時間がとられます。（特にネットワーク処理が伴うものは時間かかります。メール送信とかSlack送信とか）
- 対応として内部では`QueueHandler`や`QueueListener`を利用。
- ＜注意＞下記キュー対応ロギングを利用する場合は、全ロガー同じハンドラー内容になってしまいます。（全てのロガーに対して出力順番とか正常になるように考えて、いろいろ試した結果です）

```python
import time

from delogger import DeloggerQueue

delogger = DeloggerQueue(name='test_logger')
logger = delogger.logger

print('Start queue mode')
logger.info('Start logging')
logger.debug('debug')
logger.warning('warning')
time.sleep(1)
logger.info('End logging')
print('End queue mode')
```

![48709874-1e024380-ec4a-11e8-818f-521260c9c4e9.png](https://qiita-image-store.s3.amazonaws.com/0/218282/005b787a-be29-2998-d208-4e8a005e7e46.png "queue-logger-demo")


ロギング処理は、別スレッドで実行されているようです。


## pytest
・テストには、pytestつかいました。
・pytestのpの縦棒ぐらいの理解度ですが。。。
・軽くテスト書いてみました。完全網羅はしていませんが、最低限書いたつもりです。

## さいごに
今後も利用してみて、不満点とか出てきたら改良していきます。
ログ形式とか割と適当になっちゃったので、見やすいログ形式に変更していきたいと思ってます。（見やすいログ形式ってどんなだろう？）
主に自分で利用するために作成したパッケージですが、使ってみたいと思った方がいたら、ぜひ使ってみてください！