はじめに
AWS ECSでLaravelを動作させています
ログについては、awslogs
ドライバーを利用してCloudWatchに出力しています
その際に、CloudWatch上でLaravelのログが1行ずつ細かく出力されていて見づらかったので、ある程度纏めてみるという方法を試してみました
結論から言うと、検証時にはうまくいったのですが、実際に運用してみると、CloudWatch上でログが表示されなくなってしまいました
実際のCloudWatchから見た時のログ
まとめる前のログ
CloudWatch上でLaravelのログを確認すると、以下のように1行ずつ出力されていました
まとめた後のログ
ログの表示が出来なかったため、キャプチャはありません
まとめる方法
TerraformでECSのタスク定義を作成しているので、そこで設定を追加しました
#ContainerDefinitions
ContainerDefinitions:
- Name: "php"
Image: !Ref ECSImageLaravelRepositoryName
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group: !Ref ECSLogGroup
awslogs-region: !Ref "AWS::Region"
awslogs-stream-prefix: !Ref ProjectName
awslogs-multiline-pattern: "^(INFO|DEBUG|WARN|ERROR|CRITICAL)" < #この行を追加
awslogs-multiline-pattern について
このオプションでは、正規表現を使用する複数行起動パターンを定義します。ログメッセージは、パターンに一致する 1 行と、それに続くパターンに一致しない行で構成されます。一致する 1 行とは、ログメッセージ間の区切りです。
注記
複数行のログ記録は、すべてのログメッセージの正規表現の解析とマッチングを実行します。これによりログ記録のパフォーマンスに悪影響が及ぶ可能性があります。
Laravelから出力されるログには、先頭にLogレベルが出力されます
それを利用して一区切りにするための設定を行いました
なぜ失敗したか
ドキュメントにもあるように、パフォーマンスに悪影響がでたんだと思われます
- 後追いで調査できるように、詳細なログまで出力するようにしていたので、ログの行が膨大になっていたこと
- 秒間で2アクセス以上はあるサービスだったこと
さいごに
awslogs-datetime-format:%Y-%m-%d %H:%M:%S"
の設定も試してみたのですが、思ったように機能しませんでした
こうすると上手くいくという情報をお持ちの方がいらっしゃいましたら、教えていただけると幸いです