前置き
この記事はlaravel5.0で動作確認を行ない書いております.
laravelでのログの使い方
laravelでログ出力を行うのは簡単で, ログファサードを使用して
Log::debug('デバッグメッセージ')
と, ログレベルに対応したメソッドを呼び出してやるだけでログが書き出されます.
ログの出力レベルを変更する
デフォルトではログの出力レベルが最低(あるいは最高?)のdebug
レベルになっており
全てのログが出力されます.
開発段階では, これでよいのですが, 流石にProd環境で全てのログを出すのもバカバカしいので,
ログの出力レベルを変えたいところです.
ちょっと調べたところ, ログ出力レベルには対応する設定項目があるわけではなく, Loggerの実体であるMonoLogインスタンスに, 直接設定を渡してやる必要のようだ.
どこでこの設定を行うのかだが, DIコンテナの生成時か, 各コントロール共通のMiddlewareを作ってその中でやるかするのが良さそうです.
ここでは, 参考サイトを真似て, AppServiceProvider#register
で行うことにします.
public function register()
{
$this->app->bind(
'Illuminate\Contracts\Auth\Registrar',
'App\Services\Registrar'
);
// ログレベルの設定
$monolog = Log::getMonoLog();
foreach ($monolog->getHandlers() as $handler) {
$handler->setLevel(env('APP_LOG_LEVEL', 'error'));
}
}
あとは, 各環境毎に.env
ファイルでAPP_LOG_LEVELを設定してあげるだけでOKです.
追記
laravelのバージョン5.2では, config/app.phpでlog_level
の値を設定することができるようです.
'log_level' => env('APP_LOG_LEVEL', 'debug'),
コメントで教えてくださった@nunulk さん, ありがとうございました
実行されたSQLをログに出したい
SQL実行時に, illminate.query
というイベントが発生するので, このイベントに対するイベントハンドラを用意してやれば良い.
こんな感じのイベントハンドラクラスを作成し
class QueryLogTracker {
/**
* Create the event handler.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param illuminate.query $event
* @return void
*/
public function handle($query, $bindings)
{
//
if (env(APP_DEBUG)) {
Log::debug('EXECUTE SQL:[' . $query . ']', ['BINDINGS'=>json_encode($bindings)]);
}
}
}
app/Providers/EventProvider.phpにて, illminate.query
イベントに対するイベントハンドラとして登録してやればOK
/**
* The event handler mappings for the application.
*
* @var array
*/
protected $listen = [
'event.name' => [
'EventListener',
],
'illuminate.query' => [ // 追加
'App\Handlers\Events\QueryLogTracker',
],
];
参考