이전 포스트에서 NGINX의 전반적인 로그(Log)세팅에 대한 설정과 로그로테이트(Logrotate)를 설정해서 지정한 기간동안 지정한 포맷에 맞춰 파일을 보관하는 설정에 대해 알아봤는데요. 이번엔 로그 내용에 담겨질 로그 포맷(Format, 형식)에 대해 알아보겠습니다.

로그 포맷은 특별히 설정하지 않아도 분석하는데 불편함이 없지만 하루에 쌓이는 텍스트 양이 서버에 따라 다르겠지만 개인 블로그용 기준으로 수천, 수만개씩 쌓이기 때문에 불필요한 정보는 로그에 남지 않게 한다던가, 관리자가 알아보기 쉽에 지정하는 것이 좋습니다.

NGINX 로그 포맷 설정

nginx.conf 파일을 열어보면 패키지로 설치했을 경우 위와 같이 기본 로그 포맷이 설정되어 있으며 위의 설정을 기반으로 아래와 같이 접속 기록이 로그에 쌓이게 됩니다. (패키지에 따라 없을 수도 있는데 직접 추가하면 됩니다.)

간단하게 설명하자면 log_format구문으로 NGINX에서 로그를 기록할때의 양식을 지정하고 이 양식 이름을 main 으로 설정한 것입니다.

가상 호스트에서 지정한 양식을 불러올때는 위와 같이 로그 경로 뒤에 양식 이름을 붙이면 지정한 양식에 맞게 로그가 생성됩니다.

access_log 를 사용했을 때는 위와 같이 접속자의 정보가 지정한 위치에 기록됩니다.

필자 같은 경우 특별히 로그 분석 프로그램을 사용하지 않고 필요할때 마다 grep으로 필요한 부분만 찾아 확인하는 편이기 때문에 좀더 보기 쉽게 따옴표(“)를 삭제하고 $remote_user등의 불필요한 정보를 삭제해 아래와 같이 설정했습니다.

위와 같이 변경하면 로그 결과값은 아래와 같습니다.

중요한 것은 관리자가 로그를 보기 편하게 설정하는 것이기 때문에 아래의 syntax를 활용해 저장할 정보만 선택해서 저장하면 로그에 불필요한 자원을 소모하지 않고 깔끔하게 저장할 수 있습니다.

포맷 양식

$remote_userHTTP Authorization으로 접속했을때 사용자 계정
$remote_addr방문자 IP
$time_local요청을 처리한 시간(서버 기준)
$statusHTTP 응답 코드
$request방문자 요청
$http_user_agent방문자가 사용한 브라우저
$http_referer해당 페이지 이전의 거쳐온 URL
$body_bytes_sent보낸 데이터 (바이트)
$http_x_forwarded_for프록시 서버를 거치기 전의 접속 IP
$request_time요청을 처리하는데 걸린 시간 (초)
$connection로그를 남길 당시의 커넥션 수

만일 NGINX 앞단에 리버스 프록시(Reverse Proxy) 서버가 있을 경우 $remote_addr로는 방문자 IP 대신 프록시 서버의 IP가 찍히게 되므로 이때는 $http_x_forwarded_for를 사용해 리버스 프록시 이전의 IP가 남게 해야 합니다.

NGINX 에러 로그 레벨

에러 로그 같은 경우에는 로그가 남겨질 레벨을 지정해서 불필요한 정보는 저장되지 않게 설정하면 좋습니다. nginx.conf 에 위와 같이 설정되어 있으며 로그 레벨을 다음과 같이 변경해서 사용할 수 있습니다.

info기본 정보 제공
notice정상 수준에서 참고
warn경고 수준의 로그
error프로세스 처리시 오류
crit프로세스에 영향을 줄수 있는 오류
alert프로세스에 영향을 줄수 있는 오류 (좀더 심각함)
emerg서비스 불가 수준의 오류 (주로 설정 Syntax가 잘못된 경우)
debug디버그 정보

위의 단계중 골라 에러 로그를 남길 수 있으며 설정한 하위 레벨의 로그는 무시됩니다. 가령 에러 로그 레벨을 crit 으로 지정한 경우에는 error 수준의 로그는 남지 않게 되겠죠. 통상 crit 으로 설정합니다.

익스트림 매뉴얼 주인장 PG입니다. 다방면의 디지털 기술에 관심이 많고 삽질을 즐겨합니다. 포스트 내용중 궁금한 점이 있다면 댓글로 남겨주세요.

익스트림 매뉴얼의 모든 내용은 불펌금지 입니다. 자세한 내용은 [링크]를 참조하세요.