--> -->
Laravelのログは標準ではファイルに書き出されます。
量が少ないうちは良いのですが、多くなってくるとビューワー側がつらくなってきます。*1
そこで、MySQLにログを出力し、そこから読み出し、検索する処理を書いてみました。
なお、パッケージとして追加する方法もあるのですが、手動で追加する方法にしています。
気が向いたらパッケージ化するかも・・・(^^;)。
修正、追加が必要なファイルは以下の通りです。
次の項で1つずつ見ていきましょう。
この記事ではログの記録と閲覧を行いますが、まずはログの記録編です。
DB_LOG_TABLE=logs DB_LOG_CONNECTION=mysql_log
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
'log_max_days' => env('APP_LOG_MAX_DAYS', 7),これで、.envファイルに以下のように書けばそちらが優先されます。
APP_LOG_MAX_DAYS=7上記の指定で、7日以上前のログは随時削除されていきます。
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
|
-- DROP TABLE logs; CREATE TABLE logs ( id BIGINT NOT NULL AUTO_INCREMENT, channel VARCHAR(10), level INT, level_name VARCHAR(10), message LONGTEXT, context TEXT, remote_addr VARCHAR(40), user_agent TEXT, created_at TIMESTAMP(6) default CURRENT_TIMESTAMP(6), CONSTRAINT PRIMARY KEY( id ) ); CREATE INDEX logs_idx1 on logs ( remote_addr ); CREATE INDEX logs_idx2 on logs ( level );
次にビューワの方を作成していきます。
Laravelではページネーション*4というページ管理機能を持っています。この機能が生成するHTMLは Bootstrap CSSフレームワーク に対応したものです。また、参考にした従来のビューア(rap2hpoutre/laravel-log-viewer)もBootstrapを使用していたことから、今回も全体的にBootstrapを使用しました。
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
|
以上で完成です!
うまく動かない場合にデバッグが難しい(ログが出ないから)のですが、「var_dump() & exit;」を駆使するか、xdebugでステップ実行するなどして頑張ってみてください。
私はPhpStormで無駄な警告が出ないよう、Laravel IDE Helperを入れています。そのため、 use DB; なんて書き方をしています。IDE Helperを導入していない方は自分の環境に合わせて書き換えてくださいm(_ _)m。
SQL文をログ出力している場合、「SQL実行→LOG出力→LOGをDBに出力→SQL実行→・・・」の無限ループになります。
このため、ログ出力の為のSQL文をログ出力しないようif文を入れる必要があります。
私は app/Providers/AppServiceProvider.php でログ出力していたので、以下のように処理を追加しました。
1 2 3 4 5 6 7 8 9 |
|
ログをDBに出力する場合、phpunitのテストで問題があります。
1つはhandlerのclose()処理でDBアクセスが出来ないこと。理由は分かりませんが、testing環境の場合は呼ばれるタイミング的にオブジェクトが解放(?)されてしまっているのかもしれません。このため、ログを削除するタイミングがありません。テスト環境の初期化時(tests\TestCase\setUp())あたりで初期化(delete from logs;)してあげてください。
もう一つはテスト環境用にDatabaseを分けている場合、そちらにログ出力されてしまい、ビューワで見られない事です。ログだけ本番用に格納するのも気持ち悪いですし、ビューワ側で読めるようにしたいのですが、本番環境でtesting環境のDBアクセスがまだ上手くいっていません。
暫定的に、testing環境の時はbootstrap/app.phpでのhandlerのカスタマイズを行わないようにしていますが、$_ENVが必ずしも無い時もあるようで・・・暫定処理です(^^;)。
まあ、おいおい・・・(ぉぃぉぃ)。
Tweet
ファイルベースでページングや検索を行う場合、ファイル全体を読み込まなければならず、ログが大きくなると非常に重くなる。
DB化することで検索の高速化、途中のログの抽出の低負荷化を実現できる。
LaravelのログをMysqlで管理する。
https://laravel.cg0.xyz/laravel-mysql-email-log/
Laravelのログを標準エラーに出力する
https://qiita.com/iakio/items/86086e046f73826c9bef
Laravel 5.4 データベース:ペジネーション
https://readouble.com/laravel/5.4/ja/pagination.html