NGINX Log 관리를 효과적으로 관리하는 방법

이번 포스트에서는 NGINX log를 JSON 형식으로 출력하는 방법에 대해 알아보겠습니다. JSON 형식의 log는 구조화된 데이터로, 로그 분석 및 모니터링 도구와의 통합에 유리합니다. 아래에서는 NGINX의 설정 변경을 통해 JSON 형식의 NGINX log 구현 방법과 해당 로그를 Grafana Loki 로 확인하는 방법에 대해 설명합니다.

이 포스트에서는 Grafana, Loki, Promtail을 Docker로 배포합니다.

목차

1. JSON 형식의 NGINX Log
2. Grafana Loki 란?
3. Promtail 배포
4. Grafana Loki 연동
5. Loki를 사용하여 NGINX Log 확인
6. 결론

1. JSON 형식의 NGINX Log

NGINX는 웹 서버와 리버스 프록시 서버로 널리 사용되며, 로그는 서버의 동작을 모니터링하고 문제를 해결하는 데 중요한 역할을 합니다. JSON 형식으로 로그를 출력하면 데이터의 가독성이 높아지고 다양한 분석 도구와 쉽게 통합힐 수 있습니다.

NGINX log format을 JSON 형식으로 변경하기 위해서는 http {} 내의 log_format 지시문을 사용하여 변경할 수 있습니다.

Syntax:	        log_format name [escape=default|json|none] string ...;
Default:	log_format combined "...";
Context:	http

예시 구성은 아래와 같이 log_format 지시문에 escape=json 지시문을 추가하면 됩니다:

http {
...   
    log_format json_combined escape=json '{'
        '"time_local":"$time_local"'
        '"remote_addr":"$remote_addr"'
        '"uri":"$host$request_uri"'
        '"remote_user":"$remote_user"'
        '"request":"$request"'
        '"status":$status,'
        '"body_bytes_sent":$body_bytes_sent,'
        '"http_referer":"$http_referer",'
        '"http_user_agent":"$http_user_agent",'
        '"request_time":$request_time,'
        '"upstream_response_time":"$upstream_response_time",'
        '"upstream_addr":"$upstream_addr"'
    '}';
...
}

위와 같이 log_format을 설정하고 로그 기록을 위한 리버스 프록시 구성을 합니다:

upstream backend {
        zone badckend 64k;
        server 192.168.201.102;
}

server {
        listen 80;
        server_name example.com;

        access_log /var/log/nginx/json_format.log json_combined;

        location / {
                proxy_pass http://backend;
        }
}

NGINX 구성을 저장하고 http://example.com 에 요청하여 로그를 확인합니다.

# tail /var/log/nginx/json_format.log;

{"time_local":"21/Nov/2024:09:33:22 +0900""remote_addr":"175.196.233.10""uri":"example.com/""remote_user":"""request":"GET / HTTP/1.1""status":304,"body_bytes_sent":0,"http_referer":"","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Whale/3.28.266.14 Safari/537.36","request_time":0.002,"upstream_response_time":"0.002","upstream_addr":"192.168.201.102:80"}

위의 로그와 같이 log_format에서 지정한 JSON 형식의 NGINX Log 가 기록되는 것을 확인할 수 있습니다.

2. Grafana Loki 란?

Grafana Loki는 로그 데이터를 수집하고 저장하며, 이를 효율적으로 조회하고 시각화할 수 있는 오픈 소스 로그 관리 시스템입니다. Grafana와 통합하여 사용되며, 비용 효율적으로 운영하기 쉽게 설계되었습니다.

Grafana 배포는 이 포스트에서 생략하겠습니다.

아래 명령어를 입력하여 Loki를 배포합니다:

# docker run -d --name=loki -p 3100:3100 grafana/loki

3. Promtail 배포

Promtail은 Loki와 함께 사용되는 로그 수집 에이전트로, 다양한 소스에서 로그를 수집하고 Loki로 전송하는 역할을 합니다.

NGINX log를 수집하기 위한 Promtail 구성 파일(ex: /etc/promtail/config.yml)은 다음과 같습니다:

server:                     # Promtail 서버 설정
  http_listen_port: 9080    # Promtail이 HTTP 요청을 수신할 포트 (기본 상태 확인용)
  grpc_listen_port: 0       # gRPC 서버를 비활성화 (0으로 설정)

clients:                                            # Loki 서버 설정
  - url: http://<Loki Server>:3100/loki/api/v1/push # 로그를 전송할 Loki 서버의 HTTP URL

positions:                               # 로그 읽기 위치 관리
  filename: /etc/promtail/positions.yaml # 마지막으로 읽은 로그의 위치 정보를 저장할 파일

scrape_configs:                          # 로그 수집 설정
  - job_name: nginx                      # 수집 작업 이름 정의 (여기서는 nginx로 명명)
    static_configs:                      # 정적 로그 소스 설정
      - targets:                         # 로그 수집 대상 서버
          - localhost                    # 현재 호스트에서 로그를 수집
        labels:                          # 로그에 추가할 라벨 정의
          job: nginx                     # 작업 이름을 'nginx'로 설정
          host: ${HOSTNAME}              # 로그 수집 호스트 이름 (환경 변수 사용)
          __path__: /var/log/nginx/*.log # 수집할 로그 파일 경로

위와 같이 구성 후 Promtail을 배포합니다:

# docker run -d --name promtail -v /etc/promtail/config.yml:/etc/promtail/config.yml -v /var/log:/var/log grafana/promtail:latest -config.file=/etc/promtail/config.yml

현재 총 docker 배포 상황은 아래와 같습니다:

# docker ps

CONTAINER ID   IMAGE                     COMMAND                  CREATED             STATUS             PORTS                                       NAMES
45053f3e4d09   grafana/promtail:latest   "/usr/bin/promtail -…"   About an hour ago   Up About an hour                                               promtail

3592e72996e5   grafana/loki              "/usr/bin/loki -conf…"   25 hours ago        Up 5 hours         0.0.0.0:3100->3100/tcp, :::3100->3100/tcp   loki

abf898a9153a   grafana/grafana           "/run.sh"                9 months ago        Up 5 hours         0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   gracious_jang

4. Grafana Loki 연동

그라파나는 기본적으로 3000포트로 실행됩니다. grafana가 배포된 IP:Port를 사용하여 웹에 접속합니다.

nginx log
grafana
loki

왼쪽 메뉴에서 Connections의 Data sources를 클릭합니다.

nginx log
grafana
loki

우측 상단의 Add new data source를 클릭합니다.

nginx log
grafana
loki

검색에 loki를 검색하여 클릭합니다.

nginx log
grafana
loki

Connections에 Loki server IP와 3100 포트를 입력합니다.

nginx log
grafana
loki

IP와 포트 입력 후 하단의 Save & test 버튼을 클릭하여 테스트 및 저장합니다.

nginx log
grafana
loki

좌측 메뉴의 Explore를 클릭하여 Loki를 선택합니다.

Label filters에 promtail 구성 파일에서 지정한 label이 나타나는지 확인합니다.

5. Loki를 사용하여 NGINX Log 확인

Grafana Loki 연동이 완료되었다면, NGINX Log를 확인할 수 있습니다.

1번 박스에서 Label filters를 “job = nginx”로 설정하고 2번 박스 또는 3번 박스(실시간)에서 확인하고자 하는 시간대를 클릭 후 우즉 상단에 Run query 버튼을 클릭하면 해당 시간대에 기록된 NGINX 서버의 모든 로그를 확인할 수 있습니다.

1.번의 Label filters에서 “filename = access.log”를 선택 후, 마찬가지로 2번 박스 또는 3번 박스의 로깅 시간을 설정 후 우측 상단의 Run query 버튼을 클릭하면, 1번 Label filters에서 설정한 로그 파일을 확인할 수 있습니다.

6. 결론

시간이 지날수록 로그 관리와 모니터링의 중요성이 점점 커지고 있습니다. NGINX와 Grafana Loki를 연동하면 효과적인 로그 수집과 시각화가 가능해져, 애플리케이션의 성능과 안정성을 높이는 데 큰 도움이 됩니다.

NGINX와 Grafana Loki의 연동은 현대 웹 애플리케이션의 로그 관리와 모니터링에 있어 많은 이점을 제공합니다. 실시간 로그 수집, 중앙 집중식 관리, 유연한 쿼리 기능, 시각화 및 스케일링 용이성 등은 모두 운영팀의 효율성을 높이고, 서비스의 안정성을 강화하는 데 기여합니다.

NGINX Plus를 사용하면 Grafana에서 100개 이상의 메트릭 정보를 통해 더욱 자세한 모니터링을 확인할 수 있습니다. 자세한 내용은 아래 포스트를 확인해주세요.

NGINX Plus와 Grafana를 연동하여 로그와 메트릭을 시각화하여 편리하게 사용해보세요. NGINX Plus 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하실 수 있습니다.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required