JSON menjadi standard untuk banyak platform log, dengan menggunakan JSON pada kebanyakan kasus kita tidak perlu merubah format log tersebut, karena sudah dikenali oleh cloud log management tersebut.
Buat Project
Mari kita mulai dengan membuat project baru buat laravel, bila anda sudah memiliki aplikasi Laravel bisa langsung ke tahap selanjutnya.
composer create-project laravel/laravel laravel-api
lalu jalankan aplikasi Laravel tersebut
cd laravel-api
php artisan serve
di browser buka http://127.0.0.1:8000
sekarang buka file routes/web.php
, hapus tanda titik koma pada baris
return view('welcome')
simpan lalu refresh browser anda, log yang muncul kurang lebih seperti dibawah ini
[2025-03-12 11:48:31] local.ERROR: syntax error, unexpected token "}", expecting ";" {"exception":"[object] (ParseError(code: 0): syntax error, unexpected token \"}\", expecting \";\" at /code/laravel-api/routes/web.php:7) [stacktrace] #0 /code/laravel-api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(513): Illuminate\\Routing\\RouteFileRegistrar->register() #1 /code/laravel-api/vendor/laravel/framework/src/Illuminate/Routing/Router.php(467): Illuminate\\Routing\\Router->loadRoutes() #2 /code/laravel-api/vendor/laravel/framework/src/Illuminate/Routing/RouteRegistrar.php(207): Illuminate\\Routing\\Router->group() #3 /code/laravel-api/vendor/laravel/framework/src/Illuminate/Foundation/Configuration/ApplicationBuilder.php(248): Illuminate\\Routing\\RouteRegistrar->group() #4 /code/laravel-api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Foundation\\Configuration\\ApplicationBuilder->Illuminate\\Foundation\\Configuration\\{closure}() #5 /code/laravel-api/vendor/laravel/framework/src/Illuminate/Container/Util.php(43): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}() #6 /code/laravel-api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(83): Illuminate\\Container\\Util::unwrapIfClosure() #7 /code/laravel-api/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() #8 /code/laravel-api/vendor/laravel/framework/src/Illuminate/Container/Container.php(754): Illuminate\\Container\\BoundMethod::call() ... ...
file log Laravel berada di storage/logs/laravel.log
Merubah Log Menjadi JSON
Laravel sendiri menggunakan library monolog, yang sudah memiliki fitur transformasi log ke JSON.
ubah file config/logging.php
menjadi pada bagian single
menjadi
'single' => [ 'driver' => 'monolog', 'level' => env('LOG_LEVEL', 'debug'), 'replace_placeholders' => true, 'handler' => Monolog\Handler\RotatingFileHandler::class, 'with' => [ 'filename' => storage_path('logs/laravel.log') ], 'formatter' => Monolog\Formatter\JsonFormatter::class, 'formatter_with' => [ 'dateFormat' => 'Y-m-d', ], ],
Dengan code diatas file log Laravel berubah menjadi storage/logs/laravel-YYYY-MM-DD.log
setelah melakukan perubahan tersebut, refresh browser, anda akan melihat error yang sama dengan diatas
$ cat storage/logs/laravel-2025-03-12.log {"message":"syntax error, unexpected token \"}\", expecting \";\"","context":{"exception":{"class":"ParseError","message":"syntax error, unexpected token \"}\", expecting \";\"","code":0,"file":"/code/laravel-api/routes/web.php:7"}},"level":400,"level_name":"ERROR","channel":"local","datetime":"2025-03-12T12:02:23.044143+00:00","extra":{}}
bila dilihat di file storage/logs/laravel-2025-03-12.log
tersebut formatnya sudah JSON.
Coba kita validasi format JSON tersebut dengan jq
$ cat storage/logs/laravel-2025-03-12.log | jq . { "message": "syntax error, unexpected token \"}\", expecting \";\"", "context": { "exception": { "class": "ParseError", "message": "syntax error, unexpected token \"}\", expecting \";\"", "code": 0, "file": "/code/laravel-api/routes/web.php:7" } }, "level": 400, "level_name": "ERROR", "channel": "local", "datetime": "2025-03-12T12:02:23.044143+00:00", "extra": {} }