Nginx 로그를 회전시키는 올바른 방법


12

다음과 같은 nginx 로그를 회전하고 싶습니다.

  1. 추가 소프트웨어없이 작동합니다 (예 : "logrotate"가없는 경우 가장 좋습니다)
  2. 날짜를 기준으로 이름을 가진 회전 파일을 생성합니다.

가장 좋은 방법은 PostgreSQL과 같은 것입니다. 즉 log_filename 구성 변수에서 strftime-style % Y- % m- % d를 지정할 수 있으며, 로그 온 날짜 (또는 시간) 변경이 자동으로 변경됩니다.

아파치의 또 다른 접근법-파이프를 통해 로그를 회전 로그 프로그램으로 보내기.

내가 검색 할 수있는 한 그러한 접근법은 존재하지 않습니다. 내가 할 수있는 일은 dateext 옵션과 함께 logrotate를 사용하는 것이지만, 자체 단점이 있으며 PostgreSQL에서 | rotatelogs 또는 log_filename과 같은 기능을 사용하고 싶습니다.


블로그 기사 는 문제점에 대한 가능한 솔루션을 설명합니다. 그러나 나는 질문이 있습니다 : 왜 logrotate를 사용하고 싶지 않습니까? 그것은 일을 아주 잘하고, 의존성이 거의 없으며 작동하는 것으로 입증되었습니다 (원하는 경우 전투 강화 됨). 왜 logrotate를 사용할 수 있다면 (후프를 뛰어 넘고 오류가 발생하기 쉬운 자체 개발 솔루션을 사용 하는가) (그 시스템의 다른 로그를 회전시키는 데 유용 할 수 있습니까?)
joschi

logrotate (dateext 포함)는 거의 작동하지만 cron을 통해 실행해야하기 때문에 좋아하지 않습니다. 이에는 몇 가지 단점이 있습니다.

nginx는 로그를 다른 프로그램으로 파이프하는 기능을 지원하지 않으며, 로그 회전 자체를 지원하지 않으며 cron 기반 접근 방식이 마음에 들지 않으므로 원하는 것을 얻지 못할 수 있습니다. 때때로 "거의 작동"은 얻는 것만 큼 좋습니다. ;) 물론, nginx를 직접 패치하고 싶지 않다면.
joschi

답변:


7

세상은 겸손한 이름의 파이프가 친구인지 적인지에 따라 구분되지만 문제에 대한 가장 간단한 해결책 일 것입니다. 몇 가지 단점이 있지만 (파이프를 미리 만들어야 함) cron이 필요하지 않으며 원하는 로깅 파이프 필터를 사용할 수 있습니다.

cronolog를 사용하는 예는 다음과 같습니다 access.log.

  1. 명명 된 파이프의 경로를 선택하십시오. 나는 통나무를 보관하려고 /var/log/nginx하므로 파이프도 거기에 넣을 것입니다. 이름은 당신에게 달려 있습니다. 나는 추가 .fifo, 그것은의 access.log광산에있을 것입니다, 그래서 /var/log/nginx/access.log.fifo.
  2. 파일이 있으면 삭제하십시오.
  3. 로그 파일 용으로 명명 된 파이프를 만듭니다.

    mkfifo /var/log/nginx/access.log.fifo
    
  4. nginx.conf방금 만든 파이프에서 로그를 가리 키도록 구성 하십시오.

    access_log /var/log/nginx/access.log.fifo;
    
  5. 서버를 시작 하기 전에 파이프 수신하는 로그 회 전자를 시작하도록 init.d 스크립트를 수정하십시오 .

    LOGS="/var/log/nginx"
    pkill -f "/usr/sbin/cronolog --symlink $LOGS/access.log"
    ( cat $LOGS/access.log.fifo | /usr/sbin/cronolog --symlink $LOGS/access.log "$LOGS/%Y/%m/%d/access.log" ) &
    

    rotatelogs원하는 경우 비슷한 명령 줄이 사용됩니다 cronolog. 구문은 해당 문서를 참조하십시오.

    당신의 distrobution가있는 경우 start-stop-daemon, 당신은 이론적으로이 같은이 플랫폼에 대한 특별한 어떤 knoweldge, 해당 사용, 치료를 복용해야합니다 pkill당신을 위해. 단순히 스크립트에서 명령을 포장하고로 전달 --execstart-stop-daemon당신의에서 init.d/nginx.


나는 cronolog를 좋아한다. 더 많은 사람들이 그것을 사용하거나 추천하는 것이 좋습니다.
natacado

1

로그 라인이 프로그램에 표시되는 현재 시스템 시간과 달리 로그 된 날짜를 기준으로 공통 로그를 분할하기 위해 간단한 프로그램 인 datelog를 작성했습니다. 이것은 cronolog 또는 다른 로그 스플리터가 이미 수행 한 작업 일 수도 있고 아닐 수도 있지만 다른 사람의 작업을 찾는 것보다 내 자신을 작성하는 것이 더 빠릅니다.

기록 된 요청에서 연도 및 월을 사용하여 행은 기록 된 데이터에서 계산 된 YYYYMM을 포함하는 파일 또는 파이프에 기록됩니다. 예, 이것은 공통 로그 형식에 따라 다소 다릅니다. 첫 번째 [는 날짜를 구분하는 것으로 가정합니다. IPv6 주소를주의하십시오. :)

로그 분석의 경우 각 로그에는 실제로 각 월에 대한 요청 만 포함되어야하며 올바른 분석 결과를 위해서는 각 로그가 이상적이어야합니다. 23:59:59에 시작하는 느린 요청이 로그 파일에서 잘못된 달에 종료되기 때문에 로그 스플리터 내의 현재 시간을 기준으로 파일 이름을 결정하는 것만으로는 충분하지 않습니다.

나는 nginx가 시작되기 전에 존재하는지 확인되는 명명 된 fifo를 통해 nginx와 함께 이것을 사용합니다. datelog는 현재 성능상의 이유로 버퍼링 된 출력을 선호하는 오류 감지와 버퍼링 된 출력 사이의 프로그램에 상충 관계가 있으므로 로그 데이터를 잃지 않기 위해 특히 쉘 파이프를 사용할 때 설정이 실제로 작동하는지 확인하십시오 .

소스 코드 : http://stuge.se/datelog.c

피드백과 물론 패치를 보내 주시기 바랍니다.


1

간단한 bash 스크립트와 cron을 사용하여이를 달성 할 수 있습니다.

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
mv /var/log/nginx/access.log /var/log/nginx/nginx.access.log.$DATE
mv /var/log/nginx/error.log /var/log/nginx/nginx_error.log.$DATE
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
gzip /var/log/nginx/access.log.$DATE
gzip /var/log/nginx/error.log.$DATE

crontab 설정에 대한 자세한 내용은 다음을 참조하십시오. Cron을 통해 Nginx 로그 파일 회전


0

나는 당신의 질문을 정말로 이해하지 못합니다 .nginx는 내장 로그 로테이션을 지원하지 않기 때문에 다음과 같은 것을 사용해야합니다

mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)

/etc/cron.daily 어딘가에 (물론 전체 경로 이름으로 위의 파일 이름을 정규화해야 함) 회전 로그에 액세스하려면 apache2 유틸리티를 설치하십시오.


이것은 logrotate로 할 수있는 것과 같습니다. 그리고 나는 그것을 더 잘 원합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.