프로덕션 Rails 애플리케이션의 로그 파일을 자동/수동으로 올바르게 회전하는 방법

프로덕션 Rails 애플리케이션의 로그 파일을 자동/수동으로 올바르게 회전하는 방법

저는 맞춤형 타사 Rails 애플리케이션이 있는 서버의 관리를 맡고 있습니다. 애플리케이션 개발자는 루비 로그 파일이 점점 커지고 있다고 말하며 다음 링크를 알려줬습니다:-https://stackoverflow.com/questions/4883891/ruby-on-rails-product-log-rotation

로그는 /root/product/app/log에 있습니다. 이 폴더에는 .log로 끝나는 여러 파일이 포함되어 있습니다. 현재 로그 파일 크기는 약 2GB이며 폴더에는 "logname.log.2013_01_18.bz2" 형식의 보관된 로그 파일도 포함되어 있습니다.

아카이브 파일을 생성하는 데 어떤 명령이 사용되었는지 확인하기 위해 ssh 명령 기록을 검색해 보았지만 해당 명령은 그렇게까지 거슬러 올라가지 않습니다. 또한 "cat /var/lib/logrotate/status"를 실행했지만 logrotate가 위 폴더의 로그를 회전하지 않는 것 같습니다.

원래:

  1. 로그를 수동으로 회전시키거나 매주 일요일 밤에 자동으로 로그를 회전시키는 명령을 실행할 수 있기를 원합니다.
  2. 로그를 회전하기 위해 Rails 애플리케이션을 종료해야 하는 경우 매주 일요일 밤에 유지 관리 기간이 있으므로 문제가 없습니다.
  3. 마지막으로, 로그 파일을 매주 bz2로 압축해야 하는지, 아니면 이전 달과 관련된 순환 로그에 대해 월 단위로만 압축해야 하는지 잘 모르겠습니다. 이는 주로 이 애플리케이션이 로그를 어떻게 사용하는지 잘 모르고 Rails 애플리케이션을 사용한 적이 없고 로그 회전을 수동으로 구성할 필요가 없었기 때문입니다.

이 시점에서는 모든 로그 파일을 삭제하지 말고 보관해야 합니다. 회전을 시도하기 전에 로그를 백업하는 등 로그 회전과 관련된 모든 정보를 환영합니다.

답변1

logrotate시스템은 이를 사용하여 로그를 회전하므로 두 가지 선택이 있습니다. 이러한 애플리케이션 로그의 순환을 시스템 순환에 병합하거나, 자체 순환을 설정하고 수동으로 실행하거나 루트 사용자의 crontab에서 실행할 수 있습니다(Rails 애플리케이션이 루트로 실행되고 해당 디렉터리가 이라고 가정 /root/...).

시스템 순환

시스템의 기존 로그 간에 로그 순환을 설정하려면 디렉터리에 새 파일을 추가하기만 하면 됩니다 /etc/logrotate.d. 불러라 railsapp.conf. 나는 거기에 있는 다른 예제를 사용하여 이를 기반으로 구축할 것입니다. 또한 logrotate매뉴얼 페이지와도 통신합니다.

사용자 순환

자신만의 인스턴스를 실행하려면 logrotate명령줄 스위치를 지정하면 됩니다.

  1. 먼저 복사본을 만들어 보세요./etc/logrotate.conf /root/rails_logrotate.conf
  2. 원하는 방식으로 로그 회전을 구성하도록 파일을 편집합니다(예: 모든 로그 유지, 매주 회전 등).
  3. 달리다

    # 1st time
    $ logrotate -d -f -s $HOME/my_logrotate.state logrotate.conf
    
    # afterwards
    $ logrotate -d -s $HOME/my_logrotate.state logrotate.conf
    

    모든 것이 제대로 작동하면 전환하지 않고 이러한 명령을 다시 실행할 수 있습니다 -d. 이는 디버깅 목적으로만 사용되며 실제로 어떤 작업도 수행하지 않고 단지 수행할 작업을 보여주기 위한 것입니다.

    $ logrotate -s $HOME/my_logrotate.state logrotate.conf     
    

    -v또한 이 스위치를 사용할 때 표시되는 출력과 유사하게 이 스위치를 사용하여 자세한 내용을 표시할 수도 있습니다 -d.

  1. 이 로그 파일로 시작하세요.

    $ dd if=/dev/zero of=afile bs=1k count=10k
    10240+0 records in
    10240+0 records out
    10485760 bytes (10 MB) copied, 0.0702393 s, 149 MB/s
    
    $ ll afile
    -rw-rw-r-- 1 saml saml 10485760 Aug  6 14:37 afile
    
    $ touch -t 201307010101 afile
    $ ll afile
    -rw-rw-r-- 1 saml saml 10485760 Jul  1 01:01 afile
    
  2. 지금 달려라logrotate

    $ logrotate -v -f -s $HOME/my_logrotate.state logrotate.conf
    reading config file logrotate.conf
    reading config info for /home/saml/afile 
    
    Handling 1 logs
    
    rotating pattern: /home/saml/afile  forced from command line (1 rotations)
    empty log files are rotated, old logs are removed
    considering log /home/saml/afile
      log needs rotating
    rotating log /home/saml/afile, log->rotateCount is 1
    dateext suffix '-20130806'
    glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    glob finding old rotated logs failed
    renaming /home/saml/afile to /home/saml/afile-20130806
    creating new /home/saml/afile mode = 0664 uid = 500 gid = 501
    
  3. 검사 결과

    $ ll afile*
    -rw-rw-r-- 1 saml saml        0 Aug  6 14:40 afile
    -rw-rw-r-- 1 saml saml 10485760 Jul  1 01:01 afile-20130806
    

주간 계획

매주 일요일에 실행되도록 하려면 루트 사용자에 대해 다음 crontab 항목을 생성할 수 있습니다.

$ crontab -e

다음 줄을 추가합니다.

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
0 0 * * sun logrotate -v -f -s $HOME/my_logrotate.state $HOME/logrotate.conf

그런 다음 위 내용을 저장합니다.

실제 일, 분, 초 등을 지정하는 대신 이러한 유형의 바로 가기를 사용할 수도 있습니다.

string         meaning
------         -------
@reboot        Run once, at startup.
@yearly        Run once a year, "0 0 1 1 *".
@annually      (same as @yearly)
@monthly       Run once a month, "0 0 1 * *".
@weekly        Run once a week, "0 0 * * 0".
@daily         Run once a day, "0 0 * * *".
@midnight      (same as @daily)
@hourly        Run once an hour, "0 * * * *".

인용하다

관련 정보