ActiveSupport::LoggerThreadSafeLevel::Logger (NameError) の解決法
問題概要
Rails 6.1.7.10 + Ruby 2.6.6 環境で bundle update
後に以下のエラーが発生します:
shell
ActiveSupport::LoggerThreadSafeLevel::Logger: uninitialized constant (NameError)
典型的なエラートレース:
ruby
.../active_support/logger_thread_safe_level.rb:16:in
`module:LoggerThreadSafeLevel': uninitialized constant
ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)
発生条件:
- Rails 6.1.x(7.0以前のバージョン)環境
- concurrent-ruby gem のバージョンが 1.3.5
- Railsサーバ起動時に発生(rails console は動作)
根本原因
2025年初頭にリリースされた concurrent-ruby v1.3.5 での不具合が原因です:
- concurrent-rubyからLoggerへの依存関係が削除された
- Rails 6.1.x はLoggerがない状態でActiveSupportを読み込む
LoggerThreadSafeLevel
モジュールがLoggerクラスを参照できずエラー発生
公式GitHub Issue で報告され、根本的解決にはRails側の修正が必要です。
解決方法
方法1: concurrent-rubyのバージョンを固定(推奨)
Gemfile に以下を追加:
ruby
gem 'concurrent-ruby', '1.3.4'
ターミナルでバンドル反映:
bash
bundle update concurrent-ruby
メリット:
- 最小変更で問題解決
- 既存コード修正不要
- 全環境で即時有効
TIP
CocoaPods連携時のiOSプロジェクトでも有効:
bash
bundle add concurrent-ruby -v 1.3.4
方法2: 明示的にLoggerをrequire(暫定対策)
Railsアプリケーション初期化ファイル でrequire "logger"
を追加:
ruby
# 最上部に追加
require "logger"
require_relative "boot"
...
または boot.rb で追加:
ruby
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
require "bundler/setup"
require "logger" # 追加
require "bootsnap/setup" if defined?(Bootsnap)
注意点:
- 複数ファイルに追加する必要はありません
- 既存の
require
文と競合しないように配置
方法3: Railsのバージョンアップグレード(根本解決)
Rails 7.1 以降へアップグレード:
bash
bundle update rails
バージョン確認:
ruby
# Gemfile
gem 'rails', '>= 7.1.0'
アップグレードが困難な場合は、Railsパッチ適用:
bash
bundle update actionpack activesupport
回避策(非推奨)
ActiveSupportファイルの直接編集
ruby
require "active_support/concern"
require "logger" # 手動で追加
...
注意:
gem update
で変更が上書きされる- 本番環境に適用非現実的
各解決法の比較
方法 | 即効性 | 持続性 | リスク | 推奨度 |
---|---|---|---|---|
concurrent-ruby固定 | ◎ | △※ | 低 | ★★★★ |
require "logger" | ○ | ○ | 中 | ★★★☆ |
Railsアップグレード | △ | ◎ | 高 | ★★☆☆ |
ファイル直接編集 | ○ | ×※※ | 高 | ★☆☆☆ |
※ concurrent-rubyの今後のアップデートで対応不要になる可能性
※※ gem更新時に変更が失われるため非推奨
頻出Q&A
Q. なぜ特定環境でのみ発生?
開発環境ではロガーライブラリが別途読み込まれるため、本番環境に近い状態でのみ再現します。
Q. Railsコンソールが動作する理由rails console
ではIRB環境下でLoggerが事前読み込みされ、依存問題が表面化しません。
Q. Bootsnapが必要?
必須ではありませんが、下記追加で起動高速化可能:
ruby
gem 'bootsnap', '>= 1.18.3'
最終アドバイス
- 保守中のプロジェクト →
concurrent-ruby
を1.3.4固定 - 新規プロジェクト → Rails 7.1+への移行を検討
- 一時対応 →
config/boot.rb
にrequire "logger"
根本的解決にはRailsチームによる公式パッチ適用が必要ですが、上記措置で即時対処可能です。