[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で公開していますので利用してみてください。

© Xzxzyzyz