로그

Nginx의 기능중 누가 접속했는지, 그리고 에러가 났다면 어떠한 에러가 났는지 확인할 수 있는 로그를 남기는 기능이 있습니다.
기본적으로 `nginx.conf'파일 http블록에 전역 로그설정이 켜져있습니다.
이는 nginx에서 가동중인 모든 server의 로그를 남깁니다.

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
access log
error log

전역로그 설정 변경

전역로그 기능을 끄거나 변경할 수 있습니다.

access_log off; # 접속로그 끄기
error_log <경로> crit; # 크리티컬 에러만 로그
error_log off; # 에러로그 끄기

개별서버 로그

개별 server마다 로그를 남길 수 있습니다.
전역 설정을 끄고, 개별 서버마다 로그하는것이 좋습니다.
server블록 안에 다음을 추가하면 됩니다.

access_log <경로>;
error_log <경로>;

보통 경로는 다음처럼 설정하면 좋습니다.

access_log /var/log/nginx/<server 이름>/access.log
error_log /var/log/nginx/<server 이름>/error.log

그리고 로그가 저장될 폴더를 만듭니다.

sudo mkdir /var/log/nginx/<server 이름>

ex)

server {
    server_name vompressor.com www.vompressor.com;
    
    #### 로그 설정 ####
    access_log /var/log/nginx/vompressor/access.log;
    error_log /var/log/nginx/vompressor/error.log;

    location / {
        ## 생략 ##   
    }

    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    ## 생략 ##
}

Access 로그 포맷

nginx.conf 파일에 다음처럼 로그 포맷이 만들어져 있습니다. (없을수도 추가하면 됩니다.)

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 <경로> main

로그 포맷 양식 만들기

$remote_user HTTP Authorization 접속시 접속한 유저
$remote_addr 방문자 IP
$time_local 요청을 처리한 서버 시간
$status HTTP 응답코드
$request 클라이언트 요청
$http_user_agent 클라이언트가 사용한 브라우저
$http_referer 해당 페이지 이전에 거쳐온 URL
$body_bytes_sent 보낸 데이터 크기 (byte)
$http_x_forwarded_for 프록시 서버를 거치기 전의 접속 IP
$request_time 요청을 처리하는데 걸린시간
$connection 로그를 남길 당시의 커넥션 수

log_format 구문은 nginx.conf의 http블록안 혹은 각 서버 설정파일 최상단에 적어주세요.

log_format [포맷 이름] '포맷'
                      '포맷';

포맷을 사용하려면 access_log 끝에 포맷 이름을 적습니다.

access_log <로그 경로> <포맷 이름>;

ex)

log_format vomp_log '[$time_local] - $remote_addr | '
                    '$http_x_forwarded_for - "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"'; # 필요에따라 수정해서 사용
server {
    server_name vompressor.com www.vompressor.com;
    
    #### 로그 설정 ####
    access_log /var/log/nginx/vompressor/access.log vomp_log;
    error_log /var/log/nginx/vompressor/error.log;

    location / {
        ## 생략 ##   
    }

    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    ## 생략 ##
}

결과)

[21/Feb/2021:02:54:45 +0000] - *.*.*.* | *.*.*.* - "GET / HTTP/1.1" 200 6180 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"

error 로그 레벨

에러로그를 레벨에따라 로그를 남길수 있습니다.

info - 정보
notice - 정상
warn - 경고
error - 프로세스 처리 에러
crit - 프로새스에 영향을 주는 오류
alert - 프로새스에 심각한 영향을 주는 오류
emerg 서비스 불가 수준 오류 - 설정, syntax등이 잘못된 경우
debug 디버그 정보

사용법

error_log <에러로그 경로> <에러로그 레벨>

ex)

error_log /var/log/nginx/vompressor/error.log crit

Json으로 log 출력하기

다음처럼 포맷을 만들면 됩니다.

log_format <포맷 이름> escape=json
 '{'
   '"time_local":"$time_local",'
   '"remote_addr":"$remote_addr",'
   '"request":"$request",'
   '"status": "$status",'
   '"body_bytes_sent":"$body_bytes_sent",'
   '"request_time":"$request_time",'
   '"http_referrer":"$http_referer",'
   '"http_user_agent":"$http_user_agent"'
 '}';