웹사이트 검색

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, alertemerg를 기록하도록 지시합니다. 메시지.

다음 예에서는 crit, alertemerg 수준의 메시지가 기록됩니다.

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 상태 코드가 2xx3xx인 요청을 제외합니다.

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의 액세스 및 오류 로그에 대한 사용자 정의 로깅 형식을 구성하는 방법을 설명했습니다. 아래 피드백 양식을 사용하여 질문을 하거나 이 기사에 대한 생각을 공유하세요.