手順1. カスタムログチャンネルを作成する
作り方は公式マニュアルを参考にした。
Laravel 5.7 ログ
(※すみません。手元のLaravelが5.7だと思って5.7のマニュアルを読んでたのですが、後で確認したら5.8でした。なので上に書いたLaravelのバージョンと相違があります。)
ここでは config/logging.php
の channels
の一番下に、sqlQueryLog
なるカスタムチャンネルを追加する。
sqlQueryLog
は私が勝手につけた名前なので、べつに好きな名前でよい。必要なのは driver
に custom
を指定するのと、via
にMonologインスタンスを生成するためのクラス (※まだ無い。今から作る) を指定すること。
というわけで App\Logging\CreateSQLQueryLogger
を作る。これはカスタムチャンネル用のMonologインスタンスを生成するためのクラスで、Monolog\Logger
を返す __invoke()
メソッドが必要。
このクラス名も私がマニュアルを参考に勝手につけた名前なので、どんな名前でも構わないはず。
__invoke()
が返すMonologインスタンスは好みで作ればよい。ここでは「日ごとにログローテート (保持日数は days
で設定)」「改行コードを出力する」「カラのコンテキストは無視する」ようなやつにした。
これでカスタムログチャンネルはできあがり。アプリ内のどこかしらで以下のように書くと、sqlQueryLog
チャンネルを通って、storage/logs/sql-YYYY-MM-DD.log
ファイルにログが出力される。
手順2. SQLクエリをログ出力させる
公式マニュアルの以下ページに DB::listen()
でSQLクエリを取得する方法が書いてあるので、これを使う。
データベース:利用開始 5.7 Laravel
起動時に呼ばれるサービスプロバイダ AppServiceProvider
の boot()
で、以下のようにクエリリスナを登録する。クエリリスナの中で、先ほど作ったカスタムログチャンネル sqlQueryLog
にSQLクエリを出力させる。
↑のコードはちょっとごちゃごちゃしてるけど、各情報は以下の通りに取得できるので、フォーマットは好きな感じで。
$query->time
... 実行時間ミリ秒 (float
)
$query->sql
... 実際のSQL文 (string
)
$query->bindings
... バインドパラメータ (array
)
あとはアプリ内のどこかしらで以下のようにクエリ実行すると、storage/logs/sql-YYYY-MM-DD.log
ファイルに実行時間・実際のSQL文・バインドパラメータが出力される。
もちろん普通に \Log::debug()
とかで書いたログは、従来通り laravel.log
とかに出力される。
参考にさせていただいた記事
PHPのロガーMonologを理解しよう | QUARTETCOM TECH BLOG
Monologでログ出力の改行を有効にする | ハックノート
PHPのログクラスmonolog を 使用する|プログラムメモ