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.