ActiveJob のログで引数なしジョブに余計な "with arguments:" が出力されるバグを修正
ActiveJob の内部ロガーが、引数を持たないジョブでも "with arguments:" サフィックスを出力していた問題を、条件式に any? チェックを復活させて解消しました。これにより、ジョブのログが本来の意味を正しく伝えるようになります。
背景
ActiveJob のログ購読者である ActiveJob::LogSubscriber は、ジョブのエンキューや実行時に引数情報を付与するため args_info メソッドを使用します。構造化イベントへのリファクタリング過程で、空配列 [] が真と判定される点が見落とされ、引数なしジョブでも " with arguments: " が出力されるバグが発生しました。実運用では、ログに余計なサフィックスが残ることで可読性が低下し、デバッグ時に誤解を招く恐れがあります。
技術的な変更
変更概要
ActiveJob::LogSubscriber#args_info の条件式に、引数が実際に存在するかを確認する any? チェックを再導入しました。具体的な差分は次のとおりです。
変更前:
def args_info(event)
if (arguments = event[:payload][:arguments])
" with arguments: " +
arguments.map { |arg| format(arg).inspect }.join(", ")
else
""
end
end
変更後:
def args_info(event)
if (arguments = event[:payload][:arguments]) && arguments.any?
" with arguments: " +
arguments.map { |arg| format(arg).inspect }.join(", ")
else
""
end
end
この && arguments.any? の追加により、event[:payload][:arguments] が空配列の場合は条件が偽となり、空文字列が返されるためサフィックスが付かなくなります。
テストの追加
activejob/test/cases/logging_test.rb に、引数なしジョブ ConfigurationJob がログにサフィックスを出さないことを検証するテスト test_enqueue_job_with_no_arguments_omits_the_arguments_suffix が追加されました。テストは次のステップで動作します。
-
ConfigurationJob.perform_laterでジョブをエンキュー - ロガー出力に
"Enqueued ConfigurationJob"が含まれることを確認 -
"with arguments:"が含まれないことをassert_no_matchで検証
このテストにより、修正が期待通りに機能することが自動的に保証されます。
設計判断
後方互換性の確保
args_info のロジックは、引数がある場合の文字列生成ロジックは変更せず、空配列の場合のみ 振る舞いを変える最小限の修正に留められています。既存の引数付きジョブのログ形式は保持されるため、既存の運用や外部ツールへの影響はありません。
条件チェックの明示化
元の実装で失われていた arguments.any? のチェックは、意図的に「引数が存在しない」ケースを除外するための防御的プログラミングです。この判断は、コードの可読性と安全性を高めると同時に、将来的なリファクタリングで同様の抜け漏れを防ぐ設計指針と合致します。
まとめ
本PR は、ActiveJob::LogSubscriber#args_info に空配列チェックを復活させ、引数なしジョブのログから不要な "with arguments:" サフィックスを除去しました。最小限のコード変更とテスト追加により、既存機能への影響を防ぎつつログ品質を向上させる設計判断が取られています。