AWS SDK for Rubyを使っていて、こんな感じのログが標準出力にでてくるのが鬱陶しいことありませんか?
[Aws::S3::Client 200 0.0113 0 retries] head_object(bucket:"...",key:"...")
S3で小さいファイルを数万個単位で扱うと、このログがものすごい勢いで流れていって大事なログが流れてしまいます。また、Rails環境ではRailsログに流れますが、これをCloudWatch Logsに流していると料金も馬鹿になりません。
そんなときはこうすればサクッとログ出力を無効化できました。
Aws.config.update(logger: nil)
おまけ
どうもこの日はググり力とソースgrepが低くて、なかなか本オプションを見つけられませんでした。
結局見つけるために、「標準出力にメッセージが出ているのだからそこのbacktrace取れば良いだろう」という力技でログ出力箇所を見つけて、そこからオプションを探しました。
module CustomWrite
def write(*)
begin
raise 'dummy'
rescue => e
super e.backtrace.take(10) # 全部出すと長いので適当に絞る
end
super
end
end
STDOUT.extend CustomWrite
これを仕込むと、putsしても何してもうざいほどにバックトレースが出てきます。irbで使うと大変なことになります。
"/usr/local/lib/ruby/3.1.0/logger/log_device.rb:42:in `block in write'"
"/usr/local/lib/ruby/3.1.0/monitor.rb:202:in `synchronize'"
"/usr/local/lib/ruby/3.1.0/monitor.rb:202:in `mon_synchronize'"
"/usr/local/lib/ruby/3.1.0/logger/log_device.rb:33:in `write'"
"/usr/local/bundle/gems/activesupport-7.0.4/lib/active_support/logger_thread_safe_level.rb:65:in `add'"
"/usr/local/lib/ruby/3.1.0/logger.rb:529:in `info'"
"/usr/local/bundle/gems/aws-sdk-core-3.168.1/lib/aws-sdk-core/plugins/logging.rb:53:in `log'"
"/usr/local/bundle/gems/aws-sdk-core-3.168.1/lib/aws-sdk-core/plugins/logging.rb:43:in `block in call'"
"<internal:kernel>:90:in `tap'"
"/usr/local/bundle/gems/aws-sdk-core-3.168.1/lib/aws-sdk-core/plugins/logging.rb:41:in `call'"
あとはこのあたりから config.logger
をセットする方法を探して、 Aws.config.update
を見つけました。