Log Format 구성하기 – NGINX Plus Ingress Controller
해당 포스트에서는 NGINX Plus Ingress Controller 를 사용하여 들어오는 트래픽에 대한 로깅을 log format 을 사용하여 사용자에 맞게 구성하는 방법에 대해 알아봅니다.
로깅은 시스템에 있어 매우 중요한 역할을 합니다. 로깅이란, 시스템의 동작 상태, 사용자들의 활동, 오류 발생 시의 상황 등을 기록하는 과정을 말합니다. 따라서 이러한 로깅은 다양한 측면에서 중요한 역할을 합니다:
- 오류 진단 및 디버깅 – 서버 운영 중 발생하는 오류를 신속하게 파악하고 원인을 분석하는 데 있어 로그 파일은 핵심적인 정보를 제공합니다. 오류 메시지와 함께 발생 시점, 관련 시스템 상태 등을 기록하여 문제 해결에 도움을 줍니다.
- 시스템 모니터링 – 로그 데이터는 사고의 원인 분석 및 재발 방지 대책 수립에 있어 중요한 근거 자료가 됩니다. 또한, 로그를 통해 비정상적인 접근이나 시도를 실시간으로 감지하여 즉각적인 대응이 가능합니다.
- 보안 – 보안 사고 발생 시, 로그 데이터는 사고의 원인 분석 및 재발 방지 대책 수립에 있어 중요한 근거 자료가 됩니다. 또한, 로그를 통해 비정상적인 접근이나 시도를 실시간으로 감지하여 즉각적인 대응이 가능합니다.
- 규정 준수 및 감사 – 많은 산업 분야에서는 법적 또는 규제적 요구 사항으로 로깅을 의무화하고 있습니다. 따라서, 로그 기록은 규정 준수를 입증하고 필요 시 감사에 대응하는 데 필수적입니다.
- 성능 최적화 – 로그 데이터를 분석하여 시스템의 성능 병목 현상을 발견하고 이를 개선할 수 있습니다. 이를 통해 시스템의 처리 능력을 향상시키고, 사용자 경험을 개선할 수 있습니다.
목차
1. ConfigMap 리소스를 사용하여 log format 지정하기
2.로그를 통해 확인하기
1. ConfigMap 리소스를 사용하여 log format 지정하기
NGINX Plus 및 NGINX OSS에서 사용하는 log_format 지시문을 NGINX Plus Ingress Controller의 custom resource인 ConfigMap 리소스에서 사용할 수 있습니다.
ConfigMap 리소스를 사용한 log format 구성 방법은 다음과 같습니다:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: nginx-ingress
data:
log-format:
'|$time_local|----------------------------------------------\n "Client IP" : [$remote_addr:$remote_port] "remote_user": [$remote_user]\n "Request" : [$request]" "Status_code: [$status]" "Sent_body_bytes": [$body_bytes_sent]\n "Request_info" : "rt": [$request_time] "uct": [$upstream_connect_time] "uht": [$upstream_header_time] "urt": [$upstream_response_time]\n "Response_info": "upstream_server_status": [$upstream_status]" "recived_server":[$upstream_addr]"\n "Http_referer" : [$http_referer]\n "Agent": [$http_user_agent]\n'
위의 구성은 log format 을 예시로 커스터마이징한 구성입니다.
log format을 지정하는 것은 어렵지 않습니다. data.log-format을 선언하고, NGINX의 변수를 사용하여 log format을 쉽게 지정할 수 있습니다.
해당 log format에 포함된 내용은 다음과 같습니다.
- $time_local – 클라이언트의 요청이 처리된 로컬 시간입니다.(이는 서버의 시간대에 따라 결정됩니다.)
- $remote_addr – 요청을 보낸 클라이언트의 IP 주소입니다.
- $remote_port – 클라이언트의 포트 번호입니다.(이는 클라이언트가 서버에 연결할 때 사용하는 포트입니다.
- $remote_user – HTTP 기본 인증을 사용할 경우, 인증된 사용자의 이름입니다.
- $request – 클라이언트로부터 받은 전체 요청 라인입니다.(ex: “GET / HTTP/1.1”)
- $status: 응답의 status code입니다.
- $upstream_status – 업스트림 서버로부터 받은 응답의 HTTP status code입니다.
- $upstream_addr – 요청이 전송된 업스트림 서버의 주소입니다.
- $http_referer – 현재 요청을 생성한 페이지의 주소(URL)입니다.
- $http_user_agent – 클라이언트가 사용한 브라우저, 운영 체제 등의 정보를 포함한 클라이언트의 user agent 문자열입니다.
이 외에도 다양한 변수를 사용하여 log format 을 지정할 수 있습니다. 사용할 수 있는 변수는 여기에서 확인하십시오.
2.로그를 통해 확인하기
NGINX Plus Ingress Controller에서 제공하는 기본 log format은 다음과 같습니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: nginx-ingress
data:
log-format:
'$remote_addr - $remote_user [$time_local]
"$request" $status $bytes_sent
"$http_referer" "$http_user_agent" "$gzip_ratio"'
위 log format은 별도의 설정없이 기본적으로 제공하는 log format 입니다. 해당 로그는 NGINX Plus Ingress Controller의 Pod 로그에서 확인할 수 있습니다.
기본 log format:
x.x.x.x - - [23/Apr/2024:07:09:16 +0000] "GET /coffee/ HTTP/1.1" 200 262 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" "-"
섹션 1에서 커스터마이징한 log format:
|23/Apr/2024:07:13:37 +0000|----------------------------------------------
"Client IP" : [192.168.0.24:52148] "remote_user": [-]
"Request" : [GET /coffee/ HTTP/1.1]" "Status_code: [200]"
"Response_info": "upstream_server_status": [200]" "recived_server":[10.244.1.29:80]"
"Http_referer" : [-]
"Agent": [Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36]
위와 같이 원하는 정보들을 커스터마이징하여 보기 쉽게 log format을 지정할 수 있습니다.
NGINX Plus Ingress Controller를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하십시오.