Ruby on Railsの本番ログのローテーション


172

Ruby on Railsプロダクションアプリでログローテーションを有効にする最良の方法は何ですか?

ホスティングサーバーでlogrotateを使用するのですか、それともアプリからロガーを初期化するときに使用する一連のオプションがありますか?


これについてはすでに答えがあるようですが、あなたの環境についてお聞きしたいと思います。私はsyslog + logrotateメソッドを自分で使用していますが、明らかに環境の種類(専用、共有、* ix OSがホストしている、または別のOSなど)はここで何らかの影響を及ぼします。
イルミネート2014

回答:


203

オプション1:syslog + logrotate

システムログツールを使用するようにレールを構成できます。

config / environments / production.rbの例。

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

このようにして、syslogにログを記録し、デフォルトのlogrotateツールを使用してログをローテーションできます。

オプション2:通常のRailsログ+ logrotate

もう1つのオプションは、単にlogrotateを設定して、レールが残したログを取得することです。UbuntuとDebianでは、たとえばというファイルにあります/etc/logrotate.d/rails_example_com

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

以下の提案に従って、RailsではcopytruncateRailsアプリを再起動する必要がないように、を使用することをお勧めします。

編集:「sharedscripts / endscript」はここでは使用されていないため削除され、コメントによると問題が発生しています。そしてcreate 640 root adm提案されたコメントに従って削除されました。


3
logrotateを使用するには、config / environments / production.rbの「config.logger = SyslogLogger.new」行をコメント化したままにする必要がありますか、それともコメントを外す必要がありますか?
robertwbradford

2
ログファイルが(たとえば)に書き込まれるように、コメントアウトしたままにする必要があります。/var/www/myrailsapp/current/log/production.log
Luca Spiller

3
logrotateソリューションを使用する場合、@ amit-saxenaの回答に値します- ディレクティブcopytruncateよりも使用することをお勧めしますcreate
トムハリソン

3
あなたが使用している場合copytruncatecreateあなたはおそらくあなたの例から削除する必要がありますので、効果がありません
ミカエルWitrant

3
またsu your_rails_user your_rails_group、ログファイルの所有者とグループ(Rails / Passengerプロセスのもの)または(最近のバージョン?)の行を追加する必要がある場合があります。
oseiskar 2014

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を実行するたびにRailsを再起動してはいけませんか?
lzap 2012年

2
コピーを作成した後、元のログファイルを切り捨てて、古いログファイルを移動してオプションで新しいログファイルを作成するのではなく、一部のプログラムがログファイルを閉じるように指示できず、書き込みを続行(追加)する可能性がある場合に使用できます。以前のログファイルを永久に。ファイルのコピーと切り捨ての間に非常に小さなタイムスライスがあるため、一部のログデータが失われる可能性があることに注意してください。このオプションを使用すると、古いログファイルがそのまま残るため、作成オプションは無効になります。
lzap 2012年

1
copytruncateを使用している場合は、同じログファイルを指すため、railsを再起動する必要はありません。
amit_saxena 2012年

構成では、ログをローテーションするタイミングを指定する必要がありますか?「毎週」や「サイズ= 20M」など?または、手動でlogrotateのみを実行する場合は、省略できますか?
Damainman 2013

1
質問を正しく理解したかどうかはわかりませんが、自動ログローテーションの基準を指定する必要があります。自動化したくない場合は、ファイルを/etc/logrotate.d/ディレクトリに置かず、別の場所に保管してください。次にlogrotate --force $CONFIG_FILE、設定ファイルの場所を指定して実行し、手動で実行できます。
amit_saxena 2013

31

Rails 5の場合、これはログサイズを制限し、コンソールのサーバー出力を変更しないために私がしなければならなかったことです。

ドキュメントよると、ログフォルダーのサイズを制限する場合は、これを環境ファイル( 'development.rb' / 'production.rb')に入れます。

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

これにより、ログファイルが50Mbを超えることはありません。サイズはお好みで変更できます。2番目のパラメーターの「1」は、1つの履歴ログファイルが保持されることを意味するため、最大100Mbのログ(現在のログと前の50Mbのチャンク)が得られます。

このソリューションのソース


2
最初の引数はファイル名で、簡単に言えば「log / development.log」です。だから私はもっと長く、しかし透明な方法を好みます。config.paths['log'].first私が置くのではなくRails.root.join('log', "#{Rails.env}.log")
ミハイルチュプリンスキー

1
:はい@ZiaUlRehmanMughal、それは私がこのような設定で、Railsのに4.2.3を使用していますRailsの4での作業 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

これは、log / production.logファイルのみをローテーションし、Rails.application.config.paths['log'].first正確にこのファイルを返すことに注意してください
valachi

5

以下のためにRailsの5あなたは、毎日ログローテーションをしたい場合、あなたはこれだけを必要とします:

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

ドキュメントによるとdailyweeklyまたはを使用できますmonthly


2

すべてのログ:Railsログ、Rpushログ、...サービスの構成ファイルで次のように使用できます。

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

つまり、分割後に1つ前のログファイルのみを保存します。メインログのサイズが20 MBを超えることはありません。


-9

私のenvironments / production.rbファイルで次のように、rails logglierを使用してログをlogglyに送信できるようにします。Railsのバージョンは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.