Laravel の次のLTS、5.5もそろそろ来そうな昨今ですが、また5.1のログ出力の話です。
昨日のBlogに書いたようにプロジェクトのログ出力に faultline-php (https://github.com/faultline/faultline-php) を組み込みました。Monolog integration のありがたさよ。
今日は faultline 関係の .env 対応を進めているのですが、コードがややこしくなる前の素朴なのをサンプルとして出しておこうかな〜と。
組み込み前の状態についてはこちらをご参照ください。
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
//登録されたloggerのhandlerを置き換える
$monolog = \Log::getMonolog();
$monolog->popHandler(); //既存のhandlerを削除
$monolog->pushHandler(
(new \Monolog\Handler\RotatingFileHandler(
$this->app->storagePath() . '/logs/'
. $this->app->environment() . '_'
. (defined('ARTISAN_BINARY') ? ARTISAN_BINARY . '_' : '')
. posix_getpwuid(posix_geteuid())['name']
. '.log',
\Config::get('app.log_max_files', 5),
(\Config::get('app.debug') || $this->app->environment('testing'))
? \Monolog\Logger::DEBUG
: \Monolog\Logger::INFO //出力レベル制御のため追加
))
->setFormatter(new \Monolog\Formatter\LineFormatter(null, null, true))
);
//Faultline\MonologHandlerを追加。Notifierはregister()で行っているバインドから取得。
$monolog->pushHandler(new \Faultline\MonologHandler(App('faultline.notifier')));
$monolog->pushProcessor(
new \Monolog\Processor\IntrospectionProcessor(
\Monolog\Logger::NOTICE, //DEBUG,INFOは発生場所の情報を付加しない
[
'Illuminate\\',
//他、呼び出し元としてはスキップしたい対象を設定,
]
)
);
//.envのAPP_QUERY_LOGGINGがtrueの場合クエリを独自ログquery_{実行アカウント}.logに出力する。
if(env('APP_QUERY_LOGGING', false)) {
\DB::listen(function($query, $bindings, $time){
$queryLogger = (new \Monolog\Logger(
$this->app->environment()
))->pushHandler(
new \Monolog\Handler\StreamHandler (
$this->app->storagePath() . '/logs/query_' . posix_getpwuid(posix_geteuid())['name'] . '.log')
);
$queryLogger->info('QUERY:[' . $query . '] BINDINGS:'
. json_encode($bindings), ['TIME' => $time]);
});
}
}
public function register()
{
//faultline.notifier バインド
$this->app->bind('faultline.notifier', function($app) {
return new \Faultline\Notifier([
'project' => "project_name_{$app->env}",
'apiKey' => 'XXxxXXXXxxxXXXxxxxXXXxxxXXX',
'endpoint' => 'https://xXXXXxxxX.execute-api.ap-northeast-1.amazonaws.com/v0',
'notifications' => [
[
'type'=> 'slack',
'endpoint'=> 'https://hooks.slack.com/services/XXxxxxXXXxxxXXX/XXxxXXxXXXxxxxXXXxxxXXX',
'channel'=> '#faultline',
'username'=> 'faultline-notify',
'notifyInterval'=> 5,
'threshold'=> 10,
'timezone'=> 'Asia/Tokyo'
],
]
]);
});
}
}