redux-loggerの導入とオススメのLog出力設定の紹介

こんにちは！
今回はredux-loggerの導入解説と自分がいつも最低限おこなっているLog出力設定の紹介をさせていただきます。

`redux-logger`
https://github.com/evgenyrodionov/redux-logger
https://www.npmjs.com/package/@jarvisaoieong/redux-logger

## redux-loggerについて
redux-loggerは数あるredux middlewareの中で一番知られているものではないでしょうか。
簡単に説明させていただきますと、以下の画像のように
ActionがDispatchされる前後のstateとDispatchされたActionをconsole上に出力します。
意図したActionが発動しているか、その前後で期待したstateの変更が意図した通りに行われているかどうか
確認するためにはとても有用です。開発環境で導入されているという方は非常に多いのではないでしょうか？
![スクリーンショット 2018-09-25 22.24.32.png](https://qiita-image-store.s3.amazonaws.com/0/235987/75546116-412d-092f-8fa2-e196db076574.png)




導入方法  

`$ npm install --save redux-logger` 

または
`$ yarn add redux-logger`

```index.js
import {createStore, applyMiddleware} from 'redux'

import logger from 'redux-logger'

const store = createStore(
  reducer,
  applyMiddleware(logger)
)
```

かなり大雑把ですが、storeを以上のように設定して、reduxを用いた設計をおこなっていくと、
先ほどの画像のように、redux-loggerが適用されると思います。

## redux-loggerのLogの出力設定について
ここからが、今回の記事の本題になるのですが、今回説明させていただいてるredux-loggerですが、かなり細かくlogの表示を設定することができます。ログの出力設定ができることについては結構知られていると思いますが、デフォルトの表示がかなり優れているので、そのまま利用している方が多いのではないでしょうか？今回は、自分が特に気に入っていて、すぐに実践できる設定を紹介させていただきます。

まず出力設定の方法ですが、以下のように`createLogger`をimportします。
そして`createLogger`を用いて適用したい設定を記述し,`logger`を作成し先ほどと同じようにstoreに適用します。

```index.js
import {createStore, applyMiddleware} from 'redux'
import { createLogger } from 'redux-logger'

const logger = createLogger({
      ここに任意の設定を記述
});

const store = createStore(
  reducer,
  applyMiddleware(logger)
```

設定できるoptionは以下の通りです([公式リポジトリより抜粋](https://github.com/evgenyrodionov/redux-logger))

```
{
  predicate, // if specified this function will be called before each action is processed with this middleware.
  collapsed, // takes a Boolean or optionally a Function that receives `getState` function for accessing current store state and `action` object as parameters. Returns `true` if the log group should be collapsed, `false` otherwise.
  duration = false: Boolean, // print the duration of each action?
  timestamp = true: Boolean, // print the timestamp with each action?

  level = 'log': 'log' | 'console' | 'warn' | 'error' | 'info', // console's level
  colors: ColorsObject, // colors for title, prev state, action and next state: https://github.com/evgenyrodionov/redux-logger/blob/master/src/defaults.js#L12-L18
  titleFormatter, // Format the title used when logging actions.

  stateTransformer, // Transform state before print. Eg. convert Immutable object to plain JSON.
  actionTransformer, // Transform action before print. Eg. convert Immutable object to plain JSON.
  errorTransformer, // Transform error before print. Eg. convert Immutable object to plain JSON.

  logger = console: LoggerObject, // implementation of the `console` API.
  logErrors = true: Boolean, // should the logger catch, log, and re-throw errors?

  diff = false: Boolean, // (alpha) show diff between states?
  diffPredicate // (alpha) filter function for showing states diff, similar to `predicate`
}
```

以上の項目があるのですが、最低限自分がいつも設定している項目は

- collapsed
- diff

の2つです。

## collapsed
`collapsed = (getState: Function, action: Object) => Boolean`
非常に簡単に説明すると
`collapsed:true`とすることで、ロググループを折りたたんで表示します。（デフォルトでは`false`）
アプリケーションが大きくなってくると発行されるActionの数も次第に多くなっていき、
logがコンソールを埋め尽くし視認性が悪いと感じたことはないでしょうか.
そんな折には、この設定が有用だと僕は考えています。
デフォルトでは以下のように展開された状態で表示されますが、
![スクリーンショット 2018-09-25 22.24.32.png](https://qiita-image-store.s3.amazonaws.com/0/235987/ef4dfb4f-e6ac-7775-7f62-8fcbd06bb695.png)
`collapsed:true`とすることで、以下のように折りたたまれた状態で表示されます。
![スクリーンショット 2018-09-25 22.26.38.png](https://qiita-image-store.s3.amazonaws.com/0/235987/6c3b226a-cc61-5498-4bfd-89ab76840870.png)




## diff
`diff:true,`
こちらは`true`とすることで、Actionの発行前後における、stateの差分を`明示的`に表示してくれます。
差分が明示的に表示されることでデバッグも捗るのではないでしょうか？
（以下参考例
![スクリーンショット 2018-09-25 22.25.00.png](https://qiita-image-store.s3.amazonaws.com/0/235987/2b5bb30b-d64f-023e-1015-b6a77435a810.png)
diff部分抜粋
![スクリーンショット 2018-09-25 22.25.10.png](https://qiita-image-store.s3.amazonaws.com/0/235987/a57639b9-670f-531a-0ddc-5be78be01c7d.png)

## まとめ

簡単にまとめますと、私が最低限行う設定は以下です。

```.js
const logger = createLogger({
    diff:true,
    collapsed:true,
})
```

実際にはさらに細かく、出力の設定を行うことができますが、今回はすぐに設定できるものに限って紹介させていただきました。
需要がありましたら、他のOptionについても言及した記事を投稿したいと思います。
またよろしければ、みなさんが行っているオススメの設定などもコメントいただけたら幸いです。