저는 맞춤형 타사 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가 위 폴더의 로그를 회전하지 않는 것 같습니다.
원래:
- 로그를 수동으로 회전시키거나 매주 일요일 밤에 자동으로 로그를 회전시키는 명령을 실행할 수 있기를 원합니다.
- 로그를 회전하기 위해 Rails 애플리케이션을 종료해야 하는 경우 매주 일요일 밤에 유지 관리 기간이 있으므로 문제가 없습니다.
- 마지막으로, 로그 파일을 매주 bz2로 압축해야 하는지, 아니면 이전 달과 관련된 순환 로그에 대해 월 단위로만 압축해야 하는지 잘 모르겠습니다. 이는 주로 이 애플리케이션이 로그를 어떻게 사용하는지 잘 모르고 Rails 애플리케이션을 사용한 적이 없고 로그 회전을 수동으로 구성할 필요가 없었기 때문입니다.
이 시점에서는 모든 로그 파일을 삭제하지 말고 보관해야 합니다. 회전을 시도하기 전에 로그를 백업하는 등 로그 회전과 관련된 모든 정보를 환영합니다.
답변1
logrotate
시스템은 이를 사용하여 로그를 회전하므로 두 가지 선택이 있습니다. 이러한 애플리케이션 로그의 순환을 시스템 순환에 병합하거나, 자체 순환을 설정하고 수동으로 실행하거나 루트 사용자의 crontab에서 실행할 수 있습니다(Rails 애플리케이션이 루트로 실행되고 해당 디렉터리가 이라고 가정 /root/...
).
시스템 순환
시스템의 기존 로그 간에 로그 순환을 설정하려면 디렉터리에 새 파일을 추가하기만 하면 됩니다 /etc/logrotate.d
. 불러라 railsapp.conf
. 나는 거기에 있는 다른 예제를 사용하여 이를 기반으로 구축할 것입니다. 또한 logrotate
매뉴얼 페이지와도 통신합니다.
사용자 순환
자신만의 인스턴스를 실행하려면 logrotate
명령줄 스위치를 지정하면 됩니다.
- 먼저 복사본을 만들어 보세요.
/etc/logrotate.conf
/root/rails_logrotate.conf
- 원하는 방식으로 로그 회전을 구성하도록 파일을 편집합니다(예: 모든 로그 유지, 매주 회전 등).
달리다
# 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
.
예
이 로그 파일로 시작하세요.
$ 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
지금 달려라
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
검사 결과
$ 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 * * * *".