Nginx에서 사용자 정의 액세스 및 오류 로그 형식을 구성하는 방법
Nginx HTTP 서버에는 사용자 정의가 가능한 놀라운 로깅 기능이 있습니다. 이 기사에서는 Linux에서 Nginx에 대한 액세스 및 오류 로그에 대한 고유한 형식을 구성하는 방법을 설명합니다.
이 가이드의 목적은 웹 서버 및 웹 애플리케이션(예: 추적 요청) 내에서 전개되는 내용에 대한 디버깅, 문제 해결 또는 분석을 위해 사용자 정의 로그 형식을 구성할 수 있도록 로그 생성 방법을 이해하는 데 도움을 주는 것입니다.
참고 자료: Linux용 좋은 오픈 소스 로그 모니터링 및 관리 도구 4가지
이 문서는 액세스/오류 로그 구성과 Nginx에서 조건부 로깅을 활성화하는 방법을 설명하는 세 가지 섹션으로 구성되어 있습니다.
Nginx에서 액세스 로그 구성
Nginx에서 서버에 대한 모든 클라이언트 요청은 ngx_http_log_module 모듈을 사용하여 지정된 형식으로 액세스 로그에 기록됩니다.
기본 로그 파일은 log/access.log(Linux 시스템에서는 일반적으로 /var/log/nginx/access_log)이며 기본 로깅 형식은 일반적으로 결합 또는 기본 로그 파일입니다. 형식(배포판마다 다를 수 있음)
access_log 지시문(컨텍스트를 제외하고 위치 및 제한에 있는 경우 http, 서버, 위치에 적용 가능)은 로그 파일과 log_format 지시문(아래에서 적용 가능)을 설정하는 데 사용됩니다. http 컨텍스트만 해당)는 로그 형식을 설정하는 데 사용됩니다. 로그 형식은 공통 변수와 로그 작성 당시에만 생성되는 변수로 설명됩니다.
로그 형식을 구성하는 구문은 다음과 같습니다.
log_format format_name 'set_of_variables_to_define_format';
액세스 로그를 구성하는 구문은 다음과 같습니다.
access_log /path/to/log_file format_name; #simplest form
OR
access_log /path/to/log_file [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
다음은 CentOS 7의 기본 Nginx 구성 파일 /etc/nginx/nginx.conf에서 발췌한 것입니다.
http {
#main log format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log;
}
이 로그 형식은 다음 로그 항목을 생성합니다.
127.0.0.1 - dbmanager [20/Nov/2017:18:52:17 +0000] "GET / HTTP/1.1" 401 188 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"
다음은 일부 기본 변수를 사용하여 웹 애플리케이션에 대한 요청을 추적하는 데 사용하는 또 다른 유용한 로깅 형식입니다. 가장 중요한 것은 요청 ID가 있고 클라이언트 위치 세부 정보(국가, 국가 코드, 지역 및 도시)가 기록된다는 것입니다.
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $request_id '
'$geoip_country_name $geoip_country_code '
'$geoip_region_name $geoip_city ';
다음과 같이 사용할 수 있습니다.
access_log /var/log/nginx/access.log custom;
그러면 다음과 같은 로그 항목이 생성됩니다.
153.78.107.192 - - [21/Nov/2017:08:45:45 +0000] "POST /ngx_pagespeed_beacon?url=https%3A%2F%2Fwww.example.com%2Fads%2Ffresh-oranges-1509260795 HTTP/2.0" 204 0 "https://www.suasell.com/ads/fresh-oranges-1509260795" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" a02b2dea9cf06344a25611c1d7ad72db Uganda UG Kampala Kampala
동일한 수준에서 access_log 지시문을 사용하여 여러 로그를 지정할 수 있습니다. 여기서는 http 컨텍스트에서 두 개 이상의 로그 파일을 사용합니다.
http{
##default log format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
##request tracing using custom format
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_x_forwarded_for" $request_id '
'$geoip_country_name $geoip_country_code '
'$geoip_region_name $geoip_city ';
##this uses the default log format
access_log /var/log/nginx/access.log;
##this uses the our custom log format
access_log /var/log/nginx/custom_log custom;
}
다음은 압축 관련 변수를 포함하는 로그 형식과 압축된 로그 파일 생성에 유용한 고급 로깅 구성 예입니다.
access_log /var/log/nginx/custom_log custom buffer 32k;
access_log /path/to/log.gz compression gzip flush=5m;
Nginx에서 오류 로그 구성
Nginx에 결함이 발생할 경우 오류 로그에 관련 정보를 기록합니다. 이러한 문제는 디버그, 정보, 알림, 경고, 오류 등 다양한 심각도 수준에 속합니다. Strong>(기본 수준이며 전 세계적으로 작동함), crit, alert 또는 emerg.
기본 로그 파일은 log/error.log이지만 일반적으로 Linux 배포판에서는 /var/log/nginx/에 있습니다. error_log 지시문은 로그 파일을 지정하는 데 사용되며 기본, http, 메일, 스트림, 서버, 위치 컨텍스트(순서)에서 사용할 수 있습니다.
또한 다음 사항에 유의해야 합니다.
- 기본 컨텍스트의 구성은 항상 위의 순서대로 하위 수준에 상속됩니다.
- 하위 수준의 구성은 상위 수준에서 상속된 구성을 재정의합니다.
다음 구문을 사용하여 오류 로깅을 구성할 수 있습니다.
error_log /path/to/log_file log_level;
예를 들어:
error_log /var/log/nginx/error_log warn;
이렇게 하면 Nginx가 warn 유형의 모든 메시지와 더 심각한 로그 수준인 crit, alert 및 emerg를 기록하도록 지시합니다. 메시지.
다음 예에서는 crit, alert 및 emerg 수준의 메시지가 기록됩니다.
error_log /var/www/example1.com/log/error_log crit;
아래 구성을 고려하십시오. 여기서는 다양한 수준(http 및 서버 컨텍스트)에서 오류 로깅을 정의했습니다. 오류가 발생한 경우 오류가 발생한 수준에 가장 가까운 하나의 오류 로그에만 메시지가 기록됩니다.
http {
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
error_log /var/log/nginx/error_log crit;
server {
listen 80;
server_name example1.com;
#this logs errors messages for example1.com only
error_log /var/log/nginx/example1.error_log warn;
…...
}
server {
listen 80;
server_name example2.com;
#this logs errors messages for example2.com only
error_log /var/log/nginx/example1.error_log;
…….
}
}
아래 구성(동일 레벨)과 같이 error_log 지시문을 두 개 이상 사용하면 지정된 모든 로그에 메시지가 기록됩니다.
server {
listen 80;
server_name example1.com;
error_log /var/www/example1.com/log/error_log warn;
error_log /var/log/nginx/example1.error_log crit;
…...
}
Nginx에서 조건부 로깅 구성
어떤 경우에는 Nginx가 메시지의 조건부 로깅을 수행하기를 원할 수도 있습니다. 모든 메시지가 Nginx에 의해 기록될 필요는 없으므로 특정 인스턴스에 대한 액세스 로그에서 중요하지 않거나 덜 중요한 로그 항목을 무시할 수 있습니다.
값이 다른 변수의 값에 따라 달라지는 변수를 생성하는 ngx_http_map_module 모듈을 사용할 수 있습니다. http 콘텐츠에만 존재해야 하는 맵 블록 내부의 매개변수는 소스 값과 결과 값 간의 매핑을 지정합니다.
이러한 종류의 설정에서는 조건이 “0 ”
또는 빈 문자열로 평가되면 요청이 기록되지 않습니다. 이 예에서는 HTTP 상태 코드가 2xx 및 3xx인 요청을 제외합니다.
http{
map $status $condition {
~^[23] 0;
default 1;
}
server{
access_log /path/to/access.log custom if=$condition;
}
}
다음은 개발 단계에서 웹 애플리케이션을 디버깅하는 데 유용한 또 다른 예입니다. 그러면 모든 메시지가 무시되고 디버그 정보만 기록됩니다.
http{
map $info $debuggable {
default 0;
debug 1;
}
server{
……..
access_log /var/log/nginx/testapp_debug_access_log debug if=$debuggable;
#logs other requests
access_log /var/log/nginx/testapp_access.log main;
…….
}
}
여기에서 syslog 로깅을 포함한 자세한 정보를 확인할 수 있습니다.
지금은 여기까지입니다! 이 가이드에서는 Nginx의 액세스 및 오류 로그에 대한 사용자 정의 로깅 형식을 구성하는 방법을 설명했습니다. 아래 피드백 양식을 사용하여 질문을 하거나 이 기사에 대한 생각을 공유하세요.