user icon

Laravel 5.1 で実行ユーザー毎にログ出力

2017/2/1
不具合があったので『Laravel 5.1 でログ出力、それから (ログメールドライバー動作不良対処、クエリ出力の調整)』のほうを見て下さい

Laravel Framework version 5.1.35 (LTS) についての記事です。

muraveです。あんまりにもあんまりな記事(「PHP カンファレンス福岡 2016 で思ったこと」)を上げて反省しましたのでPHPお役立ち記事を書きたいと思います。

CLIコマンドを作ることができるフレームワーク、CakePHPなどもですが、ログ出力時にWebとCLIで実行したユーザーが異なり、権限がらみのエラーが発生したりしがちです。

そもそもログを調べる時、WebとCLIは別ファイルになってた方が良くないです?

ということでログファイルを分ける方法を考えていたのですが、実行ユーザー名でログファイルを作ればいいと気がつきました。まぁ、nginxやapacheユーザーでCLIを扱うと混ざっちゃいますが。

よ~し、おっちゃん、実行ユーザー名からファイル名を決めるインスタンスを作ってloggerを差し替えちゃぞ~

ついでにextraに呼び出し元情報を追加し(参考:「Laravelのログにファイル名やメソッド名を出力する」)、日毎のファイル作成(RotatingFileHandlerベース)にしましょう。

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)
                    )
                )
            )
        );
    }
// 以下略

bootstrapのapp.php内で設定しようとしたらenv関係でエラーが出たので上記のようにAppServiceProviderのboot()で差し替えていますが、もっと適切な場所があるのでは?というのが気になるところ。

もっとスマートな方法があったら助言いただけるとうれしいなぁ。


2016/07/20 『Laravel 5.1 でログ出力、その後 (出力レベル設定、クエリ出力)』というその後の機能拡張の話を書きました。

Facebooktwittergoogle_pluslinkedintumblrmail

タグ:

名前
E-mail
URL
コメント