ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)の対応について

初めに!

  • 今回遭遇したエラーをアウトプットすることで思考の整理を行い、エラーのシェアを行ないます。

前提

Ruby Railsのバージョン

エラー背景

  • docker compose up を行なったところgemがインストールできていないというエラーメッセージが表示される。

  • gemをインストールしてはいなかったが、ローカル環境にてbundle installそしてdocker compose buildを行い再度docker compose up`を行うが解決されない。

  • 今度はコンテナ内に入ってbundle installを行うためにdocker compose up -dを行いdocker compose exec web bashを行おうとするがwebが立ち上がっていないとエラー

  • docker compose ps -aで確認を行うと、webの部分だけexitされていることが発覚する。

  • ログを拾うためにdocker logs rails_ec-web-1を実行するとuninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)が表示される。

考えたこと

  • Loggerが初期化されていない

Ruby 3.2 以降はLoggerはデフォルトでgemをインストールしなくてはいけない

  • Loggerが見つからないから?

  • ActiveSupport::LoggerThreadSafeLevelとはなんなのか?
    Railsのログ機能に関するモジュールでLoggerレベル管理をスレッドセーフにする。

  • Loogerが初期化されるように明示的に追加する?

結論

  • concurrent_rubyのバージョンを最適なバージョンでインストールする。

  • concurrent_rubyバージョン 1.3.5 以降ではLoggerライブラリの依存関係が削除されたことによりActiveSupport::LoggerThreadSafeLevelの初期化時にLoggerクラスが見つからずNameErrorが生じると報告があった。

解決手順

  1. . Gemfile に logger を追加

  2. gem 'logger'をGemfileに追加しbundle installをしたが変わらず。

  3. config/application.rb に require 'logger' を追加

require "logger"

require "rails/all"

module MyApp
  class Application < Rails::Application
    config.load_defaults 7.0
  end
end
  • 引き続きエラーが続いた。

  • concurrent_rubyのバージョンを最適なバージョンでインストールする。 ActiveSupportconcurrent-rubyは依存関係にあり、適切なバージョンでインストールされないとLoggerの初期化エラーが生じる。
    そこでGemfileにconcurrent-ruby1.3.4でインストールする。 その後以下のコマンドを実行し、docker compose up ができた。

docker-compose down --volumes
docker-compose build --no-cache
docker-compose up

まとめ

  • Ruby 3.2 以降はLoggerはデフォルトでgemをインストールしなくてはいけない。

  • ActiveSupportconcurrent-rubyは依存関係にある。

  • concurrent-rubyは適切なバーションでインストールしなければLoggerの初期化エラーが生じてしまう。