ログの重要性
サーバサイドの開発では、ログの解析は重要になる。
なぜなら、プログラムがどのように動いているか確認する手段だからだ。
ただ、複数のファイルでログを出力する際に、「このログはどこで出力されているのか?・・」と言ったことを考えるのは時間が勿体無い
Monologを言うライブラリ
phpにはMonologと言うライブラリがある。
簡単に言うと、ログを自分の好きなようにカスタマイズできる物である。
今回はこれを使って、ログの出力をカスタマイズしてみました。
フォルダ構成
1 2 3 4 5 6 7 8 9 10 11 |
app |- Console |- Extentions |- Http |- TestLogController.php |- Controller.php |- Logging |- LogFormatter.php |- LogProcessor.php config |- logging.php |
編集しないと行けないファイル
- logging.php (ログの設定を行うファイル)
作成しないと行けないファイル
- app/Logging/LogFormatter.php (ログの出力を編集するファイル)
- app/Logging/LogProcessor.php (ログの出力内容を拡張するファイル)
Logging.phpの編集
Laravelでは"config/logging.php"でログの出力方式を管理しています。
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 |
<?php use Monolog\Handler\StreamHandler; use Monolog\Handler\SyslogUdpHandler; return [ /* どのログ形式にするかchannelで管理している、ここではどれをデフォルトにするかを決める */ 'default' => env('LOG_CHANNEL', 'daily'), /* channel 一覧 */ 'channels' => [ /* 複数のchannelを組み合わせたい場合 */ 'stack' => [ 'driver' => 'stack', 'channels' => ['daily'], 'ignore_exceptions' => false, ], /* 一つのファイルにまとめて出力したい場合(デフォルト) */ 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', ], /* 日付ごとにファイルを出力したい場合 */ 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', 'days' => 14, /* ログを拡張したり、ログの出力形式を編集したい場合は"tap"に拡張先のクラスファイルを指定する */ 'tap' => [App\Logging\LogProcessor::class,App\Logging\LogFormatter::class] ], . . . |
logging.phpは"channels"と言うキーの中に、ログの出力方法をまとめている。
各channelには"driver"と言う、実際にログを出力するプログラムを指定したり、
"path"と言う、どこにログファイルを出力するかを指定したり、
"level"と言う、どのレベル以上でログの出力を可能にするか指定したり
など色々できる。
今回は、"daily"と言うchannelを使うことで、ログを日付ごとに出力できるようにした。
また、ログの拡張をするために、"tap"というキーを指定して、拡張先のクラスファイルを配列形式で上の例のように指定しました。
LogProcessor.phpとLogFormatter.phpについて
Monologにはログで出力する内容を拡張するプロセッサーや、ログの出力内容を編集するフォーマッターがある。
今回は、出力元ファイル名と行数をログに出力するために、"IntrospectionProcessor"を使い、
ログの出力内容を編集するために"LineFormatter"を使います。
詳しくはvendor/monolog/monolog/src/Monolog/以下にいろんなプロセッサーやフォーマッターがあるので確認してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App\Logging; use Monolog\Processor\IntrospectionProcessor; use Monolog\Logger; class LogProcessor { public function __invoke($logging) { /* プロセッサーを作成 */ $introspectionProcessor = new IntrospectionProcessor( Logger::DEBUG, [], 4 ); /* ログの各ハンドラにプロセッサーを設定する */ foreach ($logging->getHandlers() as $handler) { $handler->pushProcessor($introspectionProcessor); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php namespace App\Logging; use Monolog\Formatter\LineFormatter; class LogFormatter { public function __invoke($logging) { /* フォーマットを指定 */ $format = "%datetime% [%channel%.%level_name%] %extra.class%@%extra.function%(%extra.line%) - %message%" . PHP_EOL; /* 日付のフォーマットを指定 */ $dateFormat = "Y/m/d H:i:s"; /* フォーマットを作成 */ $lineFormatter = new LineFormatter($format, $dateFormat, 1, 1); /* 各ハンドラにフォーマットを代入 */ foreach ($logging->getHandlers() as $handler) { $handler->setFormatter($lineFormatter); } } } |
_invokeメソッドで渡された、logging(ログ設定の変数)に設定した、プロセッサーやフォーマッターを代入するとログを拡張できる。
ログ出力のテスト
実際に、ログが日付、出力元、行数を含んでいるか確認する。
テスト用コントローラ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class TestLogController extends Controller { public function index() { \Log::debug('test'); } } |
ルーティング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('link-list'); }); /* 今回追加したルーティング */ Route::get('/test-log', 'TestLogController@index'); |
実際に/test-logにアクセスした結果
1 2 3 4 |
2019/03/07 12:10:37 [local.DEBUG] App\Http\Controllers\TestLogController@index(12) - test 2019/03/07 12:10:54 [local.DEBUG] App\Http\Controllers\TestLogController@index(12) - test 2019/03/07 12:10:55 [local.DEBUG] App\Http\Controllers\TestLogController@index(12) - test 2019/03/07 12:10:57 [local.DEBUG] App\Http\Controllers\TestLogController@index(12) - test |
ちゃんと日付と出力元、行数の後に結果が出力されているのを確認できる。
まとめ
- logging.phpにログに関する設定をまとめられている
- tapと言うキーでログを拡張するプロセッサーやフォーマッターを指定できる
- IntrospectionProcessorではログの出力元や行数をログに出力してくれる
- LineFormatterでは、ログで出力する内容を整形できる