본문 바로가기
환경

[Nginx] 설정 log

by SSaMKJ 2019. 1. 9.

[Nginx] 설정 log - logrotate

  • 로그 파일을 관리 안해주면 무한정 쌓이게 된다.
  • 날짜 별로 로그 파일을 새로 생성해주고, 특정 기간이 지난 것은 지워주도록 만드는 logrotate 설정에 대해서 기술한다.

[Nginx] 설정 log - logrotate Configuration File

  • nginx_logrotate
/NGINX LOG PATH/*.log {
        su USER-NAME USER-NAME
        daily
        dateformat .%Y-%m-%d
        dateext
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 USER-NAME USER-NAME
        sharedscripts
        postrotate
                if [ -f /NGINX PID PATH/nginx.pid ]; then
                        kill -USR1 `cat /NGINX PID PATH/nginx.pid`
                fi
        endscript
}

  • NGINX PID PATH, USER-NAME, NGINX PID PATH 은 서버 환경에 맡게끔 수정해서 사용해야 한다.
  • kill -USR1 명령어는 log 파일을 다시 open 하라는 명령어이다.

[Nginx] 설정 log - logrotate crontab 에 등록

  • 기본 설정이 아닌 사용자 crontab 사용.
    • 대부분의 설정 가이드에 보면 /etc/logrotate.d/ 위치에 두라고한다. 그 곳에 두면 /etc/logrotate.conf 에서 include 하여 자동으로 날마다 갱신된다.
    • log rotate 과정은 *.log 파일들을 찾아서 rotate 할 필요가 있는지 확인 한 뒤, rename, create, relopen log file 과정을 거치게 되는대
    • 아주 잠시나마 순단이 생기게 된다. 만약 서비스의 특성상 새벽 0시 쯤 사용자가 많다면 순단은 서비스에 악영향을 끼친다.
    • 보통 사용자가 가장 적은 시간은 새벽 3시로 알려져있기 때문에 이 글에서는 새벽 3시에 log rotate 하는 방법을 기술한다.
    • 만약 load balancing 을 통해서 여러 대의 서버를 구동중이라면 각각의 서버에서 log rotate 시간을 다르게 설정하여 순단의 피해를 거의 없다시피 만들 수 있다.
  • crontab -e 명령어를 통해서 crontab 설정을 open 한 뒤 새벽 3시 0분에 log rotate 가 되도록 설정한다.
0 3 * * * /usr/sbin/logrotate -s LOG_ROTATE_STATUS_FILE_PATH/nginx_logrotate.status LOG_ROTATE_CONFIGURE_FILE_PATH/nginx_logrotate
  • LOG_ROTATE_STATUS_FILE_PATH, LOG_ROTATE_CONFIGURE_FILE_PATH 은 서버 환경에 맡게끔 수정해서 사용해야 한다.
  • LOG_ROTATE_STATUS_FILE_PATH/nginx_logrotate.status 파일은 log 파일이 언제 rotate 되었는지를 기록하는 곳으로 만약 없다면 생성되며 최초 생성시에는 log 파일이 rotate 되지 않는다.
  • /usr/sbin/logrotate 에 관해서는 링크(https://linux.die.net/man/8/logrotate)를 참고바라며 간략하게 몇 가지 옵션에 대해서만 설명한다.
    • -s : status 가 저장될 파일
    • -d : debug 모드. 반영 되는 것이 아니므로 주의가 필요하다.
    • -f : 강제모드. status 에 기록된 내용과 상관 없이 log rotate를 시킨다.
  • crontab -l 명령어를 통해서 등록한 명령어가 잘 기록되었는지 확인할 수 있다.
  • log rotation configuration 파일이 정상적으로 동작하는지 확인하기 위해서는 /usr/sbin/logrotate 명령어의 -f 옵션으로 확인 할 수 있다.
$> /usr/sbin/logrotate -s LOG_ROTATE_STATUS_FILE_PATH/nginx_logrotate.status -f LOG_ROTATE_CONFIGURE_FILE_PATH/nginx_logrotate


[Nginx] 설정 log - header 로그에 찍기.

  • log_format 을 통해서 nginx log 에 남길 format을 결정한다.

    • direction : log_format
    • context : http
    • example :
log_format  custom  '$upstream_http_custom_header';

server {
    ...
    access_log /path custom;
    ...
}

그런데 말입니다. log 에는 찍고 싶은대 사용자에게는 response 하기 싫다면 말입니다...

  • log 에는 찍어야하나 사용자 response header 에서는 빼야하는 경우도 있다.
  • 이런 경우에는 proxy_hide_header를 통해서 가능하다.
log_format  custom  '$upstream_http_custom_header';

server {
    proxy_hide_header   custom-header;
    ...
    access_log /path custom;
    ...
}

  • access.log 파일에는 서버의 response header 에 넣은 custom-header 값이 남으나 http request를 통해 리턴되는 response 에서는 사라진다.


댓글