2017-10-31 18 views
4

우분투 14.04에서 Rails 5를 실행 중입니다. Linux logrotate 시스템에 의존하지 않고 내 로그를 순환시키는 방법이 있습니까? 이 설정을했습니다 ...레일즈 5 로그를 어떻게 회전합니까?

[email protected]:~$ cat /etc/logrotate.d/myapp 
/home/rails/myapp/log/*.log { 
    daily 
    missingok 
    rotate 2 
    compress 
    delaycompress 
    notifempty 
    copytruncate 
} 

그러나 아직 내 로그는 회전하지 않습니다. 그들이 얼마나 부풀어 오르는 지보십시오 ...

[email protected]:~$ ls -al /home/rails/myapp/log/ 
total 3958356 
drwxr-xr-x 2 rails rails  4096 Jul 3 22:31 . 
drwxr-xr-x 15 rails rails  4096 Sep 21 17:21 .. 
-rw-rw-r-- 1 rails rails   0 Jun 22 10:22 development.log 
-rw-rw-r-- 1 rails rails  14960 Jun 1 22:39 development.log.1 
-rw-rw-r-- 1 rails rails   0 Oct 22 2016 .keep 
-rw-r--r-- 1 rails rails 198362787 Oct 31 16:28 production.log 
-rw-r--r-- 1 rails rails 8615654 Jul 3 22:31 production.log.1 
-rw-r--r-- 1 rails rails 640621243 Jun 29 13:16 production.log.2.gz 
-rw-rw-r-- 1 rails rails 2856792698 Oct 31 17:12 sidekiq.log 
-rw-rw-r-- 1 rails rails 348853619 Jul 3 22:31 sidekiq.log.1 
-rw-rw-r-- 1 rails rails   0 Jul 3 22:31 test.log 
-rw-rw-r-- 1 rails rails  54246 Jul 3 22:31 test.log.1 

로그를 순환시키는 또 다른 방법이 있습니까? 아니면 포함 된 구성을 수정하는 방법이 있습니까? 편집

: 여기이 설정되어 크론 스크립트의

[email protected]:~$ cat /etc/cron.daily/logrotate 
#!/bin/sh 

# Clean non existent log file entries from status file 
cd /var/lib/logrotate 
test -e status || touch status 
head -1 status > status.clean 
sed 's/"//g' status | while read logfile date 
do 
    [ -e "$logfile" ] && echo "\"$logfile\" $date" 
done >> status.clean 
mv status.clean status 

test -x /usr/sbin/logrotate || exit 0 
/usr/sbin/logrotate /etc/logrotate.conf 

편집 : 내 설정/환경/production.rb 파일이 추가 시도 주석 당 ...

config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024) 

하지만 로그는 회전하지 않고 커집니다.

+0

크론 작업은 얼마나 자주 실행됩니까? cron 작업을 실행하는 명령은 무엇입니까? '/ etc/cron.daily' (아마'etc/cron.daily/logrotate')에있는 스크립트 일 경우, 그 내용은 무엇입니까? 글로벌 logrotate conf 파일의 내용은 무엇입니까 (아마도'/ etc/logrotate.conf'에 있습니까?)? –

+0

logrotate를 명시 적으로 실행해야합니까? 나는 그것이 자동으로 실행되는 리눅스 유틸리티 중 하나라고 생각했다. – Dave

+0

크론 작업에 의해 실행됩니다. 우분투에서는 일반적으로'/ etc/cron.daily/logrotate'이고 이미 존재하기 때문에 confs를 변경하면 * 물건을 회전시키기 시작해야합니다. –

답변

8

12 가지 요소 방법론 (Treat logs as event streams)을 따르면이 작업을 감독자에게 위임해야 할 수 있습니다.

예를 들어, immortal을 사용하면 운영 체제에 의존하지 않고 모든 순환 과정을 수행합니다. 에서 보조 노트로

cmd: bundle exec unicorn -c unicorn.rb 
cwd: /arena/app-1 
env: 
    DEBUG: 1 
    ENVIRONMENT: production 
log: 
    file: /var/log/app.log 
    age: 86400 # seconds 
    num: 7  # int 
    size: 1 # MegaBytes 
stderr: 
    file: /var/log/app-error.log 
    age: 86400 # seconds 
    num: 7  # int 
    size: 1 # MegaBytes 
    timestamp: true # will add timesamp to log 

:

이 경우
cmd: bundle exec unicorn -c unicorn.rb 
cwd: /arena/app-1 
env: 
    DEBUG: 1 
    ENVIRONMENT: production 
log: 
    file: /var/log/app-1.log 
    age: 86400 # seconds 
    num: 7  # int 
    size: 1 # MegaBytes 
    timestamp: true # will add timesamp to log 

이 사용할 수 stderr & stdout 로그를 분할하고 싶습니다 :

기본 구성 파일 (run.yml는)처럼 보일 수 있습니다 the 12-factor site :

12 팩터 앱 프로세스는 절대로 절대로 안됩니다. PID 파일을 monize하거나 쓰십시오. 대신 운영 체제의 프로세스 관리자를 사용하여 출력 스트림을 관리하고 충돌 한 프로세스에 응답하며 사용자가 시작한 다시 시작 및 종료를 처리하십시오.

[면책 조항 : 나는 immortal]의 저자 해요, 그리고 아이디어 중 하나는 뒤에 디스크를 작성 걱정할 필요없이 규모로 애플리케이션의 자동화를 충당하기 위해 실제로 때 제대로되고 게다가 회전하지 로그 루트 권한 없이도 run.yml 파일을 수정하여 가장 쉬운 방법으로 배포 (시작/재시작) 할 수 있습니다.

+0

내 파일 시스템에서 run.yml이 설치 되나요? – Dave

+0

@Dave check [immortaldir] (https://immortal.run/post/immortaldir/)'/ etc/immortal /'에 파일을 추가 할 수 있습니다. 이렇게하면 재부팅시에도 파일이 계속 유지됩니다. 'immortal -c your.yml'을 실행하십시오 – nbari

+0

@Dave 아마도 이것 또한 https://immortal.run/post/systemd/에 도움이 될 수 있습니다. 우분투 14 및 새로운 버전> = 16에서도 작동해야합니다. – nbari