RailsでSidekiqのログをLTSVで出力する

これ、置いておきますね。

Gemfile
1
gem 'ltsv'
gem 'sidekiq'
config/initializers/sidekiq.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

class SidekiqLtsvFormatter < Sidekiq::Logging::Pretty
def call(severity, time, _, message)
"#{LTSV.dump({
time: time.utc.iso8601(3),
pid: ::Process.pid,
tid: Thread.current.object_id.to_s(36),
context: context,
level: severity,
message: message
})}\n"

end
end

Sidekiq.logger.formatter = SidekiqLtsvFormatter.new

だけではあれなので、少し説明をします。


Sidekiq gemのログは

https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/logging.rb#L10-L13

このcallの返り値を出力したものになります。

よって、このcallを何らかの方法で置き換えてあげれば、出力する内容を変えることができます。
例えば

1
2
3
def call(severity, time, _, message)
"ピエールおはよ〜"
end

とすると、ログに ピエールおはよ〜ピエールおはよ〜ピエールおはよ〜 ...と出力されるということです。
callで改行を行わないと、ログが改行されずに出力されることに注意です。

データをLTSVに成形するために、 ltsv というgemを使っています。
使い方の詳細はltsvのREADME参照です。

最後に、Sidekiq.logger.formatterを自作のもので置き換えてあげれば終了です。

sidekiqの再起動が必要かもしれません。変わらなければ一度再起動をしてみてください。