Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連
  • インフラ

AWS SDK Rubyで標準出力へログが出るのを抑制する

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 を見つけました。

関連記事

AWS ECSで踏み台サーバーを手軽に立ち上げる


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。