はじめに
Railsでログを出力するとき
Rails.logger.warn "警告ログ"
と書くか
logger.warn "警告ログ"
と書くか、迷ったことはありませんか?
この記事では、Rails.logger と logger.warn の違いを「機能」「用途」「JavaScriptの感覚」に分けてわかりやすく解説します。
基本的な機能について
Rails.logger と logger.warn は、出力されるログや 動作は基本的に同じ です。
ただし 使う場所 や 意図 によってどちらを選ぶかが変わってきます。
JavaScript的に例えると…
Rails.logger.warn
は
console.warn()
に相当(どこでも使える グローバルなロガー )です。
logger.warn
は
this.logger.warn()
に相当( クラスに渡されたロガー を使う)ことになります。
JavaScriptで書くとこう
// Rails.logger のイメージ
console.warn("グローバルなログ");
// logger のイメージ
class Job {
constructor(logger) {
this.logger = logger;
}
run() {
this.logger.warn("クラス専用のログ");
}
}
Rails.logger と logger.warn の機能説明
| 項目 | Rails.logger | logger(→ logger.warn) |
|---|---|---|
| 定義元 | Rails全体 | 各クラス(Controller、Jobなど) |
| ログ出力レベル |
.info, .warn, .error など対応 |
同様に .warn などが使える |
| 出力先 |
log/development.log 等 |
同じく Rails.logger と同じ出力先 |
| 実体 | ActiveSupport::Logger |
通常 Rails.logger を内部で参照 |
ActiveSupport::Logger
標準Logger(Ruby標準ライブラリ)を拡張したクラス
簡易的な違い
| 比較項目 | Rails.logger.warn |
logger.warn |
|---|---|---|
| 使える場所 | どこでも(グローバル) | クラス内でのみ(ローカル) |
| 可読性 | 冗長になりやすい | スッキリ書ける |
| 実体 | 常に Rails.logger
|
通常は Rails.logger を指す |
具体的な違いのコード例
# ジョブ内での使用例
class NotifyJob < ApplicationJob
def perform
logger.warn "これはlogger経由の警告"
Rails.logger.warn "これはRails.logger経由の警告"
end
end
この2つ、ログ出力結果は全く同じになります。
実務でのおすすめ運用
結論として、Railsのクラス(Controller / Job / Modelなど)では…
logger.warn を使うのが一般的でおすすめ!
理由
- Railsが
loggerメソッドを用意してくれている(= Rails.logger のエイリアス) - クラス内部で短く書けて読みやすい
- テスト時にロガーを差し替える設計にも対応しやすい
例外的に Rails.logger を使う場面
| シチュエーション | 理由 |
|---|---|
lib/ や初期化スクリプト |
logger が定義されていない |
| グローバルで一貫したログ出力をしたいとき | 明示的に Rails.logger を使いたい場合 |
まとめ
| 書き方 | 特徴 | 実務おすすめ度 |
|---|---|---|
Rails.logger.warn |
グローバル。どこでも使える | △(場面による) |
logger.warn |
クラス内。簡潔でRails推奨形 | ◎(実務で使いやすい) |
さいごに
Railsでは「どちらを使うか」以上に「 一貫して使い分けること 」が大切です。
チーム内でルールがない場合は、「 クラス内では logger を使う 」という方針で統一すると、コードがスッキリして保守もしやすくなります。