お仕事で運用しているRedmineのメンテナンス中に発生した問題です。
Problem
Ruby on Railsの複数バージョン混在環境で、脆弱性のあるバージョンがインストールされていることがわかり、Railsのうち当該バージョンのみアンインストールを行った。
- インストール済バージョン: 4系、6系、7系
- アンインストール対象バージョン: 4系、7系
その後 rails -v
コマンドを実行すると uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)
というエラーが発生するようになった。
/usr/local/lib/ruby/gems/3.1.0/gems/activesupport-6.1.7.2/lib/active_support/logger_thread_safe_level.rb:16:in `<module:LoggerThreadSafeLevel>': uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)
Logger::Severity.constants.each do |severity|
^^^^^^
from /usr/local/lib/ruby/gems/3.1.0/gems/activesupport-6.1.7.2/lib/active_support/logger_thread_safe_level.rb:9:in `<module:ActiveSupport>'
from /usr/local/lib/ruby/gems/3.1.0/gems/activesupport-6.1.7.2/lib/active_support/logger_thread_safe_level.rb:8:in `<top (required)>'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from /usr/local/lib/ruby/gems/3.1.0/gems/activesupport-6.1.7.2/lib/active_support/logger_silence.rb:5:in `<top (required)>'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from /usr/local/lib/ruby/gems/3.1.0/gems/activesupport-6.1.7.2/lib/active_support/logger.rb:3:in `<top (required)>'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from /usr/local/lib/ruby/gems/3.1.0/gems/activesupport-6.1.7.2/lib/active_support.rb:29:in `<top (required)>'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from /usr/local/lib/ruby/gems/3.1.0/gems/railties-6.1.7.2/lib/rails/command.rb:3:in `<top (required)>'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from /usr/local/lib/ruby/gems/3.1.0/gems/railties-6.1.7.2/lib/rails/cli.rb:12:in `<top (required)>'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from <internal:/usr/local/lib/ruby/site_ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
from /usr/local/lib/ruby/gems/3.1.0/gems/railties-6.1.7.2/exe/rails:10:in `<top (required)>'
from /usr/local/bin/rails:25:in `load'
from /usr/local/bin/rails:25:in `<main>'
Solution
gem list
コマンドでインストール済のGemの一覧を取得、concurrent-ruby
のv1.3.5以上が存在するかチェック。
もし存在したらアンインストールする。
原因はだいたいこういうことらしい: Ruby on Railsが依存するconcurrent-ruby
。このGemはv1.3.5より前は logger
に依存していたが、v1.3.5以降は依存しなくなった。これによりlogger
がロードされなくなったが、Rails自体は引き続きこれを必要としている。とくに今回アンインストールせずに残した6系は必要としている。
結果、rails
コマンド等の処理でlogger
を参照するコードが実行されるとエラーが発生する。
concurrent-ruby
のv1.3.5をアンインストールし、同環境にインストール済のより古いバージョンのconcurrent-ruby
(logger
に依存)がRailsから利用されるようにすることで、logger
のロードも復活し、事象が解消する。
この問題について報告しているStackOverflowの投稿: