[Laravel] ログの保存先にオンラインのRoolbarを使う
Laravelのログは通常ローカルの/storage/logs
ディレクトリへ保存されますが、オンライン上のエラーモニタリングサービスのRollbar
へ保存してみましょう。
Error Tracking & Crash Reporting for Software Developers - Rollbar
Laravelのバージョン5.6
で、Log周りに関する大きなアップデートがありました。
Loggingにchannel
形式が採用され、一つ、あるいは複数の場所へログを保存できるようになりました。
デフォルトで便利なドライバが複数用意されていますが、オリジナルのchannnelを作成してRollbar
へログを送信します。
公式のパッケージ
Rollbar
では公式に以下のLaravel用のパッケージが用意されています。
GitHub - rollbar/rollbar-php-laravel: Rollbar error monitoring integration for Laravel projects
しかしこれは5.6
に対応したロギングドライバではなく、単に今までのログシステムの拡張として、全てのログをRollbar
へ送信する実装です。
src/RollbarServiceProvider.php のbootメソッドを見てみましょう。
/**
* Bootstrap the application events.
*/
public function boot()
{
// Don't boot rollbar if it is not configured.
if ($this->stop() === true) {
return;
}
$app = $this->app;
// Listen to log messages.
$app['log']->listen(function () use ($app) {
$args = func_get_args();
// Laravel 5.4 returns a MessageLogged instance only
if (count($args) == 1) {
$level = $args[0]->level;
$message = $args[0]->message;
$context = $args[0]->context;
} else {
$level = $args[0];
$message = $args[1];
$context = $args[2];
}
$app['Rollbar\Laravel\RollbarLogHandler']->log($level, $message, $context);
});
}
ログイベントのリスナーとして、Rollbar
へのログ送信を登録しています。
Auto-Discoveryに対応しているので、composerでパッケージの追加を行った時点でこのリスナーが追加されることになります。5.6
でも利用可能ですが、二重にログが保存されるでしょう。
カスタムドライバの実装
前述のサービスプロバイダを参考にして、Laravel5.6
のログchannelとして実装します。
channelの登録には、Monolog\Logger
インスタンスを返すクラスを実装するだけです。
インスタンスの作成にはchannel名と、Monolog\Handler
が必要ですが。
公式パッケージより、Rollbar\Laravel\RollbarLogHandler
が利用できるので、これをMonolog\Handler\PsrHandler
としてハンドラへ登録します。
// RollbarLoggerクラス
public function __invoke(array $config)
{
$defaults = [
'environment' => app()->environment(),
'root' => base_path(),
];
$config = array_merge($defaults, $config);
if (empty($config['access_token'])) {
throw new \InvalidArgumentException('Rollbar access token not configured');
}
if (empty($config['person_fn'])) {
$config['person_fn'] = function() {
return $this->person();
};
}
$rollbar = new \Rollbar\Rollbar;
$rollbar->init($config);
$logger = new \Rollbar\Laravel\RollbarLogHandler($rollbar->logger(), app());
$handler = new \Monolog\Handler\PsrHandler($logger);
return new \Monolog\Logger('rollbar', [$handler]);
}
あとはconfing/logging.php
へchannelとして登録するだけでRollbar
へのログが送信されます。
全ての実装はGitHubで公開していますので利用してみてください。