LaravelのログをJsonで吐き出せる様にする方法、AWSのCloudWatchを使おう。


AWSCloudWatchでログを見やすくするため、Laravelのログをjsonで出力

この記事はこちらの記事を参考にしました。
こちらの記事では、ログフォーマットを変更する方法について記載されており。
そちらのコードの必要な部分だけを抜粋し、ログファイルをjsonに変更する方法を紹介します。
https://qiita.com/nuuuuume/items/a6bcf340c50f18cfb71c

前提:設定ファイルにjsonと書くだけでjsonになるんじゃないの。

様々なサイトを見てみましたがどうやらそういった設定はない様です。
ログをjsonで出力するには自分でログを整形する必要がある様です。

ちなみにLaravel ver 5.7です。

ログをjsonに変更する手順

今回触るファイルは大きく分けて3つです。

  • config/logging.php <元からあるファイル
  • app/Logging/CustomFormatterApply.php <作ってください
  • app/Logging/LineExFormatter.php <作ってください

app/Logging/CustomFormatterApply.php

こちらのコードは参考にした記事のコードそのままですorz

CustomFormatterApply.php
<?php

namespace App\Logging;

use App\Logging\LineExFormatter;
class CustomFormatterApply {
  public function __invoke($logging) {
    $exFormatter = new LineExFormatter();

    foreach ($logging->getHandlers() as $handler) {
      $handler->setFormatter($exFormatter);
    }
  }
}

app/Logging/LineExFormatter.php

ここが実際にjsonに変換している部分です。
eval(\Psy\sh());などで$recordの内容を確認するとわかりますが。
エラーやメッセージが発生した時の情報全てがここに詰まってます。

<?php
 namespace App\Logging;
 use Monolog\Formatter\LineFormatter;
 class LineExFormatter extends LineFormatter {
  public function format($record) {
    return json_encode($record);
  }
}

config/logging.php

このファイルの中にある daily の部分にtapで作成したCLASSを配列で渡す

config/logging.php

'daily' => [
    'driver' => 'daily',
    'path' => storage_path('logs/laravel.log'),
    'level' => 'debug',
    'tap' => [App\Logging\CustomFormatterApply::class],
    'days' => 14,
],

確認してみましょう

適当なControllerの適当なアクションにコードを挿入

test.php
use Log;
Log::info('Test Log Show!!!!');

出力先は開発環境の中のこちら

file
storage/logs/laravel-2019-05-08.log

出力結果

無事json形式で出力されました。

result
{"message":"Test Log Show!!!!","context":[],"level":200,"level_name":"INFO","channel":"local","datetime":{"date":"2019-05-08 15:46:04.104462","timezone_type":3,"timezone":"Asia\/Tokyo"},"extra":[]}