2017/2/1
不具合があったので『Laravel 5.1 でログ出力、それから (ログメールドライバー動作不良対処、クエリ出力の調整)』のほうを見て下さい
少し前に書いた『Laravel 5.1 で実行ユーザー毎にログ出力』という記事の続き的なものです。
環境も変わらず Laravel Framework version 5.1.35 (LTS) です。
前回のあらすじ
「ログ出力時に実行ユーザー名ベースでログファイルを作るようにすればログファイルの権限絡みのエラーを回避できるし何処から起動された処理かわかりやすくなって良くない?」と思ったボク。AppServiceProviderのboot()でloggerを差し替えつつも「ここでやっちゃっていいのかしら」という戸惑いを感じたりもして…
で、戸惑ってましたが実行準備の一貫としてAppServiceProviderでやってて問題なさそうかなと思ってます。ツッコミもこなかったし。
今回は実際に開発で使っていて
・デバッグフラグ(app.debug)を落とした状態ではINFO以上のログのみ出力
・デバッグフラグ(app.debug)を立てた状態では発行されたクエリをDEBUGログで出力
という機能追加をしたので、その紹介です。
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
$this->app->instance('log', new \Illuminate\Log\Writer(
(new \Monolog\Logger(
$this->app->environment()
))->pushProcessor(
new \Monolog\Processor\IntrospectionProcessor(
\Monolog\Logger::DEBUG,
[
'Monolog\\',
'Illuminate\\',
//他、呼び出し元としてはスキップしたい対象を設定,
]
)
)->pushHandler(
new \Monolog\Handler\RotatingFileHandler(
$this->app->storagePath() . '/logs/' . posix_getpwuid(posix_geteuid())['name'] . '.log',
\Config::get('app.log_max_files', 5),
\Config::get('app.debug') ? \Monolog\Logger::DEBUG : \Monolog\Logger::INFO //出力レベル制御のため追加
)
)
)
);
//app.debugがtrueの場合クエリをログに出力する。
if(\Config::get('app.debug')) {
\DB::listen(function($query, $bindings, $time){
\Log::debug('QUERY:[' . $query . '] BINDINGS:'
. json_encode($bindings), ['TIME' => $time]);
});
}
}
// 以下略
出力レベルはロギングハンドラ側に設定があったんですね。前回は未指定だったので全レベルが出力される状態でした。
app.debugでコントロールすることにして3項演算子でapp.debugが有効な場合はDEBUG、無効な場合はINFOを設定することにしました。
もう一つのクエリ出力についてはloggerとは別の話ですが、設定した場所も近いですしついでに紹介。
実行されたクエリを見ないと不安になるので確認方法は必須ですが、デバッグ状態で常に出力されるのは過剰な感じもしています。見えないよりはいいかな。
Tags: Laravel
今まで意識したことがなかったのですがposix_getpwuidのためにphp-posixが必要らしいです。