【Rails】sidekiqでログを出力するための方法を、公式リファレンスから理解する

# 概要
Docker環境で、sidekiqログをローカルで見ようとしたらやり方がわからなかったので備忘録として残します。

# 内容
[公式リファレンス](https://github.com/mperham/sidekiq/wiki/Logging)を参考にしながら進めます。
早速実際の様子です。

```
class YourWorker
  include Sidekiq::Worker

  def perform(*args)
    logger.info "Things are happening."
    logger.debug { "My args: #{args.inspect}" }
  end
end
```

## logeer.infoを利用する
def perform以下を見てください。logger.info/debugと記載されています。

このlogger.〇〇（ログレベルが入ります）の後ろに、出力したい変数やエラーメッセージなどを指定します。

もう少し例を具体的にみてみましょう。
例えば、事前に処理した変数をsidekiq側に送れているかどうかをチェックしたいとすると、以下のように記述します。
```sidekiq.rb
=begin
事前に処理した変数
=end
update_hoge_objects = {user: {name: "saito"}, {age: "25"}}

=begin
hoge_worker.rb
=end
class HogeWorker
  include Sidekiq::Worker

  def perform(update_hoge_objects)
    logger.info update_hoge_objects
  end
end

=begin
出力結果
=end
=> {user: {name: "saito"}, {age: "24"}}
```

これで、ログの出力方法が分かりました。

## sidekiqのログレベルについて
どこで設定すればいいのかわかりませんが、環境ごとに出力するログレベルは変更できるようです。

ひとまずここでは、infoで進めます（自分の環境ではinfoレベルだったため）が、この辺のレベル設定はrailsのログレベルと同じです。

参考：ログレベル
```
ログの重要度
←低　                                        高→
debug → info → warn → error → fatal → unknown 
```

ちなみに、自分のローカル環境のレベルを確認するには、後述するログの確認方法で見ることができる、以下のようなログを確認してください。

```
2050-08-06T06:00:39.891Z 1 TID-xxxxx HogeFugaWorker JID-xxxxxxxxxxxxxxxxxxxxxxxxxx INFO: start
```

最後のあたりにINFOという文字が確認できると思います。
ここで表示されているのがローカル環境のログレベルです。

この場合はINFOなので、logger.infoとします。

## ログの見方
ここまでで、出力したいログを表示するためには、logger.ログレベルと記述することを確認しました。

では、実際にログの内容を見るためにはどうすれば良いでしょうか？

railsのログ(development.logとか)では、見ることができません。なぜなら、sidekiq.logというファイルが別に生成されているためです。

これも設定が必要なことではありますが、通常は以下のように設定されていると思います。

```config/sidekiq.yml
:logfile: ./logs/sidekiq.log
```

今回は、このように設定されている場合のログファイルの確認方法を見ていきます。

手順としては、以下の通りです。

**1. docker exec -itコマンドでsidekiqコンテナに入る**
**2. sidekiq.logが格納されているディレクトリまで移動する**
**3. catコマンドでファイルを展開する**

順に見ていきましょう。
### 1. docker execコマンドでsidekiqコンテナにイン
まずはdocker psコマンドでsidekiqのコンテナidを見つけ、そのコンテナidを利用してsidekiqコンテナに侵入します。

その前に、コンテナはdocker-compose up等で起動させておきましょう。

```
docker exec -it コンテナid bash
```
これで入ることができると思います。

### 2. sidekiqが格納されているディレクトリまで移動
コンテナに入ったら、コンテナのルートディレクトリから移動する必要があります。

どこにsidekiq.logが格納されているかについては、先ほどの記載しましたが、sidekiq.ymlに以下のような記載がある場合はそれを参考します。

```
:logfile: ./logs/sidekiq.log
```

今回は、logsディレクトリに格納されているようなので、以下のようにcdコマンドでディレクトリを移動します。


```
cd logs
```

### 3. catコマンドでファイルを展開
sidekiq.logが格納されているディレクトリに移動出来たら、いよいよsidekiq.logを開きます。

ファイルの展開は、catコマンドを使います。

```
cat sidekiq.log
```

これでうまくいくと、先ほど確認したようなsidekiqのログがズラーっと表示されるはずです。

```
2050-08-06T06:00:39.891Z 1 TID-xxxxx HogeFugaWorker JID-xxxxxxxxxxxxxxxxxxxxxxxxxx INFO: start
2050-08-06T06:00:39.891Z 1 TID-xxxxx HogeFugaWorker JID-xxxxxxxxxxxxxxxxxxxxxxxxxx INFO: {user: {name: "saito"}, {age: "25"}}
2050-08-06T06:00:39.891Z 1 TID-xxxxx HogeFugaWorker JID-xxxxxxxxxxxxxxxxxxxxxxxxxx INFO: done
```

これで、ログを確認することができました！

## 注意点
これで基本の見方はわかりましたが、sidekiqは1つ注意が必要なことがあるので補足します。

それは、**ファイルを編集した時には、sidekiqを再起動しないと変更が適応されないことです**

なので、dockerを利用している場合は、一度コンテナを停止させて、起動し直すか、[こちら](https://qiita.com/mk_0409/items/da24479d1b8e739645a2)の記事で書かれている方法もローカルでは正常に機能することが確認できています。

いずれにせよ、再起動しないとsidekiqへの変更が適応されないため、logger.infoを記述して、そのまま処理を走らせてもログが表示されないので注意が必要です。

# まとめ
sidekiqさん、いつも大量のデータをぶん投げても対応してくれてありがとう。

# 参考
https://qiita.com/mk_0409/items/da24479d1b8e739645a2

https://ruby-doc.org/stdlib-3.0.2/libdoc/logger/rdoc/Logger.html

https://github.com/mperham/sidekiq/wiki/Logging