Rails ロガータグは永続的に残ります
概要
Rails 7.0.4 で Active Support のタグ付きログを使用すると、タグは永続的なままになります。奇妙な動作のように見えます。ドキュメントでは、タグ付きの使用は現在のメッセージにのみ適用されるべきであると示唆していますが、おそらく私が文言を間違って解釈している可能性があります。
また、フラッシュメソッド(タグリストをクリアするようです)も機能しません。
Railsコンソールでの私のテスト:
3.1.2 :027 > Rails.logger.tagged( "ThisIsTag" ).info( "ThisIsMessage" )
[ThisIsTag] ThisIsMessage
=> 26
3.1.2 :028 > Rails.logger.info( "ThisIsMessage" )
[ThisIsTag] ThisIsMessage
=> 14
3.1.2 :029 > Rails.logger.flush
=> nil
3.1.2 :030 > Rails.logger.info( "ThisIsMessage" )
[ThisIsTag] ThisIsMessage
=> 14
3.1.2 :031 > Rails.logger.tagged.info( "ThisIsMessage" )
ThisIsMessage
=> 14
3.1.2 :032 > Rails.logger.info( "ThisIsMessage" )
ThisIsMessage
=> 14
1 つのメッセージにタグを適用すると、次のすべてのログに同じタグが付けられるようです。とても奇妙だ。タグをクリアする唯一の方法は、パラメータなしで tagged を呼び出すことであることがわかりました。しかし、コード内でこれを使用するのは、率直に言って非常に面倒です。例は次のとおりです。
def foo
# some code
Rails.logger.tagged( "Debug 123" ).debug( "Important debug message" )
Rails.logger.tagged
# some more code
end
そこで私の質問は、期待通りに動作するかということです。実際の状況ではタグをどのように使用する必要がありますか?もしかしたら私はこの機能を誤用しているかもしれませんが、私の理解では、意図に従って正しく使用しています。
解決策
これはバグのようです。
Rails 7.0 でサンプルを実行すると、コンソールにブロードキャストされる出力にのみ影響することがわかります。しかし、ログ ファイルを見ると、ログに記録されたメッセージ全体でタグ付けが保持されていないことがわかります。たとえば、次のようにするとします。
Rails.logger.tagged('MyTag').info('Message1')
[MyTag] Message1
Rails.logger.info('Message2')
[MyTag] Message2
そうすれば、log/development.log はタグを「Message1」にのみ正しく適用します。
[MyTag] Message1
Message2
あなたが説明している動作は、この未解決の問題にも記載されています。この問題も関係していると思います。
Rails 7.1 では、デフォルトではログ出力はコンソールにブロードキャストされません。したがって、ログを別の場所にブロードキャストしようとしない限り、この動作は発生しません。