はじめに
Rails 6 に追加されそうな新機能を試す第28段。 今回は、 ActiveSupport::TaggedLogging
編です。
Rails 6 では、 ActiveSupport::TaggedLogging.new
の動作が変わります。
これまでは、引数で指定されたLogger オブジェクトを返していましたが、dup したオブジェクトを返すようになりました。
実際に Logger オブジェクトを作って、ログ出力して確認した方がわかりやすいので、試してみます。
Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
$ rails --version
Rails 6.0.0.rc1
Rails プロジェクトを作る
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
Controller と View を作る
ログ出力するため、Controller と View を作ります。
$ rails g controller tagged_logging index
controller でログ出力する
controller で、ログ出力するように修正します。
- logger0 は
Logger.new
- logger1 は
ActiveSupport::TaggedLogging.new(logger0)
- logger2 は
ActiveSupport::TaggedLogging.new(logger1)
として、それぞれのオブジェクトからログ出力します。
class TaggedLoggingController < ApplicationController
def index
logger0 = Logger.new(Rails.root.join('log', Rails.env + '.log'))
logger1 = ActiveSupport::TaggedLogging.new(logger0)
logger2 = ActiveSupport::TaggedLogging.new(logger1)
logger1.tagged('TAG1') do
logger2.tagged('TAG2') do
logger0.info("log by logger0(id = #{logger0.__id__})")
logger1.info("log by logger1(id = #{logger1.__id__})")
logger2.info("log by logger2(id = #{logger2.__id__})")
end
end
end
end
rails server を実行してブラウザで表示する
rails server
を実行して、ブラウザで http://localhost:3000/tagged_logging/index にアクセスします。
log/development.log を確認する
log ファイルを確認すると、logger0, logger1, logger2 の出力がそれぞれ異なっていることがわかります。
また、 logger0, logger1, logger2 が異なるオブジェクトであることがわかります。
I, [2019-05-28T13:34:30.186276 #254] INFO -- : log by logger0(id = 47414341832000)
[TAG1] log by logger1(id = 47414341831820)
[TAG2] log by logger2(id = 47414341831700)
Rails 5.2.3 では
Rails 5.2.3 では、logger0, logger1, logger2 ともに同じオブジェクトになるため、タグとオブジェクトのIDが同じになります。
[TAG1] [TAG2] log by logger0(id = 47309018280300)
[TAG1] [TAG2] log by logger1(id = 47309018280300)
[TAG1] [TAG2] log by logger2(id = 47309018280300)
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try028_tagged_logging