CloudWatchLogsで複数行またいだログを適切に扱う

2021-04-02AWSCloudWatchLogs


CloudWatchLogsエージェントを使ってログを集める際のはなし

RailsのログからFATAL,ERRORなどのログだけ抽出してSlackに投げようというような運用はよくある

CloudWatchLogsにログを集めて行う場合はLogsのサブスクリプションフィルタを使って対象を絞ってLambdaなどを介して通知する

が、スタックトレースを伴うエラーなどのログは改行が含まれているのでデフォルトの設定だと1行1行が別々のログとして扱われてしまう

複数行のログでも1つのまとまりとして扱いたい

そこでmulti_line_start_patternの設定をする

設定

オプションはこの正規表現にマッチする行がスタートですよという意味合い

Fluentdとかでもこういうのあったね

CloudWatch Logs エージェントのリファレンス - Amazon CloudWatch Logs

  • /opt/aws/amazon-cloudwatch-agent/bin/config.json
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/path/to/log/hoge.log",
            "log_group_name": "/cwl-test/dev/rails",
            "log_stream_name": "{instance_id}",
            "multi_line_start_pattern": "[F|E|W|I|D], .*"
          }
        ]
      }
    }
  },

Rails.loggerを通してログを出力した場合は基本的にログ1件の単位が上記の正規表現で対応できる状態になる

こんなログが1件として扱われる

F, [2021-04-02T17:40:01.079206 #21599] FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/hoge"):
.....
.....
.....