Cloudwatch에 nginx, spring boot에서 발생하는 log 남기기
DevOps

Cloudwatch에 nginx, spring boot에서 발생하는 log 남기기

Cloudwatch로 로그 전송하기

nginx의 로그를 남기기 위한 configuration

// vi nginx.conf

http {
  access_log /var/log/nginx/access.log
  error_log /var/log/nginx/error.log
  ... 
}

도커 실행

sudo docker stop proxy && sudo docker rm proxy
sudo docker build -t nextstep/reverse-proxy:0.0.2 .
sudo docker run -d -p 80:80 -p 443:443 --name proxy -v /var/log/nginx:/var/log/nginx nextstep/reverse-proxy:0.0.2

 

EC2에 awslogs agent 설치하기

만약 python --version 했을 때, 혹은 python3 --version을 했을 때 2.6 ~ 3.5 사이의 파이썬이 설치되어있다면 아래 실행문에서 sudo apt-get install python은 진행하지 않아도 된다!

  • ubuntu 18.04 LTS
    curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
    sudo apt-get install python
    sudo python ./awslogs-agent-setup.py --region ap-northeast-2

마지막 줄을 실행할 때 다음과 같은 입력창이 뜰 것이다.

이 때, Access Key Id와 Secret Access Key가 없다면 그냥 엔터만 치고 넘어가면 된다. 다른 것을 입력할 경우 에러가 발생할 수 있다.

나머지는 디폴트 양식을 정하는 과정인데, 아래 awslogs.conf 파일을 설정하면서 모두 커스텀할 수 있는 부분이므로 모두 엔터를 치고 넘어가도 상관 없다.

하지만 마지막에 More log files to configure? 에서는 N으로 응답해야 끝내고 나올 수 있다. Y를 입력하면 무한정 입력받을 것..

awslogs.conf 파일을 커스텀하기

AWS의 AgentReference 문서를 해석한 내용이다.

 

Agent configuration file은 다음과 같이 .conf 파일로 작성할 수 있다. conf파일의 [general] 섹션에는 모든 로그 스트림에 공통적으로 적용할 것을 명시할 수 있다. [logstream] 섹션은 로컬 파일을 cloudwatch의 원격 로그 스트림으로 보내는 데에 필요한 정보를 나타낸다. 한 config 파일 내에 여러 개의 [logstream]을 포함할 수 있되, [] 안의 이름은 모두 달라야한다.

 

[general]
state_file = value
logging_config_file = value
use_gzip_http_content_encoding = [true | false]

[logstream1]
log_group_name = value
log_stream_name = value
datetime_format = value
time_zone = [LOCAL|UTC]
file = value
file_fingerprint_lines = integer | integer-integer
multi_line_start_pattern = regex | {datetime_format}
initial_position = [start_of_file | end_of_file]
encoding = [ascii|utf_8|..]
buffer_duration = integer
batch_count = integer
batch_size = integer

[logstream2]
...

 

작성 예시는 다음과 같다.

 

// sudo vi /var/awslogs/etc/awslogs.conf

[/var/log/syslog]
datetime_format = %b %d %H:%M:%S
file = /var/log/syslog
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = [로그그룹 이름]

[parameter 설명]

  • datetime_format = 날짜를 어떤 식으로 표시할건지
  • file = cloudwatch logs에 푸시할 로그 파일을 나타낸다. 와일드카드를 사용하여 특정 파일 또는 여러 파일을 가리킬 수 있다. 파일 수정 시간을 기준으로 최신 파일만 cloudwatch logs에 푸시된다. 
  • buffer_duration = 버퍼의 지속 시간
  • log_stream_name = cloudwatch의 설정한 로그 그룹에서 남겨질 로그 스트림의 이름
  • log_group_name = 로그 그룹 이름
  • initial_position = start_of_file / end_of_file

예를 들어서, 조앤_로그 라는 로그 그룹 내에 조앤_에러_로그 라는 stream name으로 로그 파일을 전송하고 싶다면 각각 log_group_name 과 log_stream_name을 설정해주면 된다.

 

설정 후에는 다음 명령어를 꼭 실행해 awslogs를 재실행시켜준다.

sudo service awslogs restart

 

그리고 해당 인스턴스에 cloudwatch IAM 롤을 부여하면, cloudwatch 로그 그룹에서 우리가 설정한 이름의 로그 그룹을 확인할 수 있을 것이며 로그를 cloudwatch로 보낼 수 있다. 가끔 file이 제대로 인식되지 않거나 혹은 해당 파일이 존재하지 않아서 로그 그룹에 등장하지 않을 때가 있다. 이럴 때엔 file에 적은 위치에 해당 파일이 존재하는지 확인해보는 것이 좋다.

 

끗!