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',
            ],
 
        ],

git diff logging laravel

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
laravel error missing semi colon

$ 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": {}
}

Leave a comment

Your email address will not be published. Required fields are marked *