Ruby on Rails 프로덕션 로그 회전


172

Ruby on Rails 프로덕션 앱에서 로그 순환을 활성화하는 가장 좋은 방법은 무엇입니까?

호스팅 서버에서 logrotate를 사용합니까, 아니면 앱에서 로거를 초기화 할 때 사용할 옵션 세트가 있습니까?


이미 이에 대한 답변이 있지만 환경이 무엇인지 묻고 싶었습니다. 나는 syslog + logrotate 메소드를 직접 사용하지만 분명히 환경의 종류 (전용, 공유, * ix OS가 호스팅하는 종류 또는 다른 종류 등)는 여기에 약간의 영향을 미칩니다.
ylluminate

답변:


203

옵션 1 : syslog + logrotate

시스템 로그 도구를 사용하도록 레일을 구성 할 수 있습니다.

config / environments / production.rb 의 예제입니다 .

# Use a different logger for distributed setups
config.logger = SyslogLogger.new

이렇게하면 syslog에 로그하고 기본 logrotate 도구를 사용하여 로그를 회전 할 수 있습니다.

옵션 2 : 일반 Rails 로그 + 로그 로테이션

또 다른 옵션은 레일에 남은 로그를 가져 오도록 logrotate를 구성하는 것입니다. 우분투와 데비안에서는 예를 들어라는 파일에 /etc/logrotate.d/rails_example_com있습니다.

/path/to/rails.example.com/tmp/log/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

아래의 제안에 copytruncate따라 Rails에서는 Rails 앱을 다시 시작하지 않아도되도록 사용하는 것이 좋습니다 .

편집 : "sharedscripts / endscript"는 여기에서 사용되지 않으므로 설명에 따라 문제가 발생하기 때문에 제거했습니다. 그리고 create 640 root adm의견에 따라 제거 되었습니다.


3
logrotate를 사용하려면 config / environments / production.rb의 "config.logger = SyslogLogger.new"행에 주석이 남아 있거나 주석 처리를 제거해야합니까?
robertwbradford 2016 년

2
로그 파일이 작성되도록 주석 처리 된 상태로 유지해야합니다 (예 : /var/www/myrailsapp/current/log/production.log
Luca Spiller

3
logrotate솔루션을 사용하는 경우 @ amit-saxena의 답변이 가치가 있습니다. 지시적 copytruncate초과 사용을 제안합니다 create.
Tom Harrison

3
당신이 사용하는 경우 copytruncate, create당신은 아마 당신의 예에서 제거해야하므로, 아무런 효과가 없습니다
의 Michaël Witrant

3
또한 su your_rails_user your_rails_group로그 파일의 소유자 및 그룹 (예 : Rails / Passenger 프로세스의 소유자 및 그룹)에 줄을 추가해야 하거나 (최근 버전?) logrotate가 권한에 대해 불평 할 수 있습니다.
oseiskar

56

logrotate를 사용하는 경우 /etc/logrotate.d/ 디렉토리에 conf 파일을 배치하여 아래 표시된 옵션 중 하나를 선택할 수 있습니다.

# Rotate Rails application logs based on file size
# Rotate log if file greater than 20 MB
/path/to/your/rails/applicaton/log/*.log {
    size=20M
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

또는

# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
  weekly
  missingok
  rotate 52
  compress
  delaycompress
  notifempty
  copytruncate
}

copytruncate는 현재 로그의 백업 복사본을 만든 다음 계속 쓰기 위해 로그 파일을 지 웁니다. 다른 방법은 create를 사용하여 현재 파일의 이름을 바꾸고 이전 파일과 동일한 이름의 새 로그 파일을 만들어 회전을 수행하는 것입니다. 작성이 필요하다는 것을 모르면 copytruncate를 사용 하는 것이 좋습니다 . 그 이유는 이름이 변경 되어도 Rails가 여전히 이전 로그 파일을 계속 가리키고 새 로그 파일을 찾기 위해 다시 시작해야하기 때문입니다. copytruncate는 활성 파일과 동일한 파일을 유지하여이를 방지합니다.


그러나 logrotate가 실행될 때마다 레일을 다시 시작해서는 안됩니까?
lzap

2
사본을 작성한 후 기존 로그 파일을 이동하고 선택적으로 새 로그 파일을 작성하는 대신 원본 로그 파일을 잘라내십시오. 일부 프로그램에서 로그 파일을 닫으라고 지시 할 수 없어서 쓰기 (추가)를 계속할 수있는 경우에 사용할 수 있습니다. 이전 로그 파일을 영원히. 파일 복사와 잘라 내기 사이에 시간 분할이 매우 작으므로 일부 로깅 데이터가 손실 될 수 있습니다. 이 옵션을 사용하면 이전 로그 파일이 그대로 유지되므로 create 옵션이 적용되지 않습니다.
lzap

1
copytruncate를 사용하는 경우 여전히 동일한 로그 파일을 가리 키므로 레일을 다시 시작할 필요가 없습니다.
amit_saxena

구성시 로그 교체시기를 지정해야합니까? "주간"또는 "size = 20M"과 같은? 또는 logrotate를 수동으로 만 실행하려는 경우이를 생략 할 수 있습니까?
Damainman

1
귀하의 질문을 올바르게 이해했는지 확실하지 않지만 자동 로그 회전에 대한 기준을 지정해야합니다. 자동으로 저장하지 않으려면 파일을 /etc/logrotate.d/ 디렉토리에 넣지 말고 다른 곳에 보관하십시오. 그런 다음 logrotate --force $CONFIG_FILE구성 파일 위치를 지정하여 수동으로 실행할 수 있습니다.
amit_saxena

31

Rails 5의 경우 로그 크기를 제한하고 콘솔에서 서버 출력을 변경하지 않기 위해 수행해야하는 작업입니다.

문서에 따르면 로그 폴더의 크기를 제한하려면 환경 파일 ( 'development.rb'/ 'production.rb')에 넣으십시오.

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

이를 통해 로그 파일은 50Mb보다 커지지 않습니다. 크기를 원하는대로 변경할 수 있습니다. 두 번째 매개 변수의 '1'은 1 개의 기록 로그 파일이 유지되므로 최대 100Mb의 로그 (현재 로그 및 이전 청크 50Mb)를 갖게됩니다.

이 솔루션의 소스 .


2
첫 번째 인수는 간단히 말해서 'log / development.log'와 같은 파일 이름입니다. 더 길지만 투명한 방법을 선호합니다. 대신 config.paths['log'].first내가 넣었 어Rails.root.join('log', "#{Rails.env}.log")
미하일 Chuprynski

1
@ZiaUlRehmanMughal 예, Rails 4와 함께 작동합니다. Rails 4.2.3을 다음과 같은 구성으로 사용하고 있습니다. config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS

1
읽기이 쉽게하려면, 당신은 ActiveSupport에 의존 할 수 있음을 언급 그것의 가치는 확장 바이트 : 50.megabytes와 동일하다 50 * 1024 * 1024, 그러나 이해하기 훨씬 쉽습니다. 자세한 내용은 ActiveSupport 코어 확장 을 참조하십시오.
Pierre-Adrien Buisson

1
인터넷 검색 (프로그래머 라이프 : D) 후 다시 여기에 도착했습니다. 로그 폴더의 모든 로그 파일을 회전하도록이 줄을 구성 할 수 있는지 궁금합니다. 분명히이 선은 첫 번째 선만 회전합니다.
Zia Ul Rehman Mughal

이것은 단지 당신이로 / production.log 로그 파일을 회전 않습니다 Rails.application.config.paths['log'].first반환 정확히이 파일
valachi

5

들어 레일 오 당신이 일일 로그 회전을하려는 경우, 당신은이 필요합니다 :

  config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')

있는 해당하는 문서를 , 당신이 사용할 수있는 daily, weekly또는 monthly.


2

모든 로그에 대해 : Rails 로그, Rpush 로그, ... 서비스 설정 파일에서 다음과 같이 사용할 수 있습니다.

 config.log_file = 'log/rpush.log'
 config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)

의미 : 분할 후 1 개의 이전 로그 파일 만 저장하십시오. 기본 로그 크기는 20MB를 넘지 않습니다.


-9

environment / production.rb 파일에서 다음과 같이 rails logglier를 사용하여 로그에 로그를 보낼 수 있습니다. 레일 버전은 4.1.0입니다

RailsApplication::Application.configure do
require 'logglier'
config.logger = Logglier.new(<https://logs-01.loggly.com/inputs/inputkey>)
log.info("hello from logglier")
end

무엇을해야하는지 제안 해주세요 ...이 코드는 작동하지 않습니다
riya khana

Rails 버전은 4.1.0이고 Ruby의 버전은 2.1.1입니다.
riya khana
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.