LoginSignup
3
1

More than 3 years have passed since last update.

Rails6 のちょい足しな新機能を試す28(ActiveSupport::TaggedLogging編)

Last updated at Posted at 2019-05-30

はじめに

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)

として、それぞれのオブジェクトからログ出力します。

app/controllers/tagged_logging_controller.rb
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 が異なるオブジェクトであることがわかります。

log/development.log
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が同じになります。

log/development.log
[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

参考情報

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1