初gemを作成した
Logrageを利用していてActiveJobのログも出力したかったのでgemを作った。
gem作成から公開までをやったのは初めてだったのですごくドキドキだったけど、やったみて良かった。
なんで作ったの?
Logrageは下記のようにaction_controllerに対してLogrageで用意したLogSubscriberを登録しているので、コントローラーを通るものしかログが出ない。
https://github.com/roidrage/lograge/blob/v0.10.0/lib/lograge.rb#L142
非同期処理にActiveJobを利用していて、そのログもlogrageで同様に出力したいなと思ったのがきっかけ。
どういう仕組み?
まあ、実装はほとんどLogrageの実装と同じ感じなんだけど。
RailsにはActiveSupportのInstrumentationというものがあり、Railsで色々イベントが用意されているので開発者がフックできる。
Active Support の Instrumentation 機能 | Rails ガイド
Logrageもこの中のprocess_action.action_controllerを利用してログの出力を行なっている。
なので、コントローラーを通らないとこのイベントが発生しないのでActiveJobのログはlogrageでは出力されない。
ActiveJobにもxxx.active_jobというイベントが設定されているので、これを利用してLogrageでログ出力を行なっている。
全て対応しようかとも思ったけど、今回のユースケースはjobの処理が終わった時の情報(エラーが起きたらエラーの情報も)が欲しかっただけなので、今回はperform.active_jobのみ対応することにした。
これからもチャンスがあれば積極的にGemを作っていきたい。