AWS CloudWatch Logs에서 예외 로그 검색

5525 단어 장고CloudWatchAWS
현재 근무하고 있는 기업에서는 Django에서 개발한 어플리케이션을 Docker Compose를 이용해 운용하고 있습니다.

Docker 로그는 다음 명령으로 확인할 수 있습니다.
# appコンテナのログエントリーを表示し続ける(-fオプションでtail)
$ docker-compose logs -f app

# appコンテナの直近の500件のログエントリーを表示する
$ docker-compose logs --tail=500 app

그러나, 운용하고 있으면, 여러가지 트러블이 있어, 트러블의 때마다 컨테이너를 실행하고 있는 서버에 로그인해, 컨테이너의 로그를 확인하는 것이 귀찮다.

또, 컨테이너를 파기하면, 지금까지의 로그도 파기해 버리기 때문에, 운용 환경에서는 외부의 로그 보존 소프트웨어에 로그를 송신해 보존합니다. Docker Compose에서는 log driver를 이용하여 fluentd, AWS, GCP에 로그를 보내고 저장할 수 있습니다.

현재 애플리케이션은 AWS에서 실행 중이므로 다음 1-3단계를 수행하여 AWS CloudWatch Logs에 로그를 보내기로 결정합니다.
1. EC2インスタンスにIAMロールを設定
2. CloudWatch Logsでロググループを作成
3. docker-compose.ymlを修正

1. EC2 인스턴스에 IAM 역할 설정



컨테이너를 실행하는 EC2 인스턴스에 다음 IAM 역할을 만들고 구성합니다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

참고:
Amazon CloudWatch Logs 로깅 드라이버

2. CloudWatch Logs에서 로그 그룹 생성



AWS 콘솔에서 CloudWatch에 액세스하고 로그 --> 로그 그룹에서 액션 버튼을 누릅니다. 그런 다음 표시된 대화 상자에 로그 그룹 이름을 입력하고 "로그 그룹 만들기"버튼을 눌러 생성합니다.



3. docker-compose.yml 수정



다음 설정을 docker-compose.yml에 추가합니다.

docker-compose.yml
version: '3'
services:
  app:
    ・・・(中略)・・・
    logging:
      driver: "awslogs"
      options:
        awslogs-region: "us-east-2" # オハイオリージョン
        awslogs-group: "/sample-app/dev/"
        awslogs-create-group: "true" # グループがない場合は作成
        awslogs-stream: "web"

이제 다음과 같이 CloudWatch 로그에 저장할 수 있습니다.



로그를 CloudWatch 로그에 저장할 수 있는 것이 좋지만 예외가 발생하면 로그가 다음과 같이 한 줄씩 분할되어 매우 보기 어려워졌습니다. 예외가 발생한 스택 추적도 한 줄씩 분할하지 않고 한 줄로 저장합니다.



docker-compose.yml에 awslogs-multiline-pattern을 추가합니다. 또한 로그를 구조화하고 CloudWatch에서 쉽게 검색할 수 있도록 django-structlog라는 모듈을 설치합니다. django-structlog에 대해서는 참고를 참조해 주세요.

docker-compose.yml
version: '3'
services:
  app:
    ・・・(中略)・・・
    logging:
      driver: "awslogs"
      options:
        awslogs-region: "us-east-2" # オハイオリージョン
        awslogs-group: "/sample-app/dev/"
        awslogs-create-group: "true" # グループがない場合は作成
        awslogs-stream: "web"
        awslogs-multiline-pattern: '^{"request_id":'

다음과 같이 예외도 한 줄의 로그로 CloudWatch Logs에 저장할 수 있습니다.





참고:
장고에서 로깅 (logging)하는 방법

좋은 웹페이지 즐겨찾기