16 Stimmen

Wie lassen sich Protokolle für Schienenanwendungen am besten rotieren?

Ich habe ein 1GB Slice von slicehost und ich habe 4 Projekte auf dieser Box laufen. Alle 4 Anwendungen sind Ruby on Rails Anwendungen. Ich fragte mich, was ist der beste Weg, um sicherzustellen, dass Log-Dateien rotiert werden.

Ich würde es vorziehen, 4 verschiedene Protokolldateien zu haben, eine für jede Anwendung, anstatt eine große Protokolldatei für alle 4 Anwendungen zu haben.

Ich verwende Ubuntu.

Ich bin Beifahrer.

17voto

Bill Turner Punkte 3661

Ich verwende auch logrotate (Sie müssen es über apt-get installieren). Erstellen Sie eine neue logrotate-Datei in Ihrem Verzeichnis /etc/logrotate.d/. Hier ist ein Beispiel für eine von meinen:

# for the rails logs
/home/apps/*/shared/log/*log {
  daily
  rotate 14
  notifempty
  missingok
  compress
  sharedscripts
  postrotate
    /usr/bin/touch /home/apps/application1/current/tmp/restart.txt
    /usr/bin/touch /home/apps/application2/current/tmp/restart.txt
  endscript
}
# for the apache logs
/home/apps/logs/*log {
  daily
  rotate 14
  notifempty
  missingok
  compress
  sharedscripts
  postrotate
    /etc/init.d/apache2 restart
  endscript
}

Dies rotiert sowohl die rails production.logs als auch die apache access/error logs (ich führe meine Anwendungen unter passenger aus).

6voto

Gabe Kopley Punkte 15797

Ich würde einfach die integrierte Rotation verwenden, die der Schienenlogger bietet:

# in config/application.rb
config.logger = Logger.new(Rails.root.join('log', "#{Rails.env}.log"), 3, 10.megabytes)

Dadurch werden die Protokolldateien rotiert, sobald sie eine Größe von 10 MB erreichen, und die 3 zuletzt rotierten Protokolle werden gespeichert.

5voto

Shyam Habarakada Punkte 14267

Wir hatten vor kurzem mit diesem Problem zu tun und haben festgestellt, dass logrotate no die beste Lösung. Die Verwendung erfordert, dass Sie die Rails-App jedes Mal neu starten, wenn Protokolle rotiert werden, was ein unnötiger Leistungsverlust zu sein scheint.

Eine bessere Lösung ist es, den Standard-Rails-Logger in den Konfigurationsdateien Ihrer Anwendung zu überschreiben.

# in config/environments/development.rb
config.logger = Logger.new("#{Rails.env}.log", "daily")

und verwenden Sie dann ein Skript, das Dateien bereinigt, die älter als n Tage sind. Sie können logrotate für diesen Teil verwenden, wenn Sie möchten. Wir verwenden eine Rake-Aufgabe wie,

desc "Cleanup application logs older than 30 days"
task :logs => :environment do
  require 'fileutils'
  Dir.glob("#{Rails.root}/log/*.log.*").
    select{|f| File.mtime(f) < (Time.now - (60*60*24*30)) }. # older than 30 days
    each { |f| 
      puts "Removing #{f}"
      FileUtils.rm f 
    }
end

3voto

Jed Smith Punkte 15042

Dies ist eine Meta-Programmierung, und es ist umstritten, ob sie auf ServerFault oder SO sein sollte.

logrotate , ein Standardpaket für eine Reihe von Betriebssystemen, und Sie können apt-get install logrotate wenn Sie es noch nicht haben. Es kann dazu gezwungen werden, die Protokolle zu rotieren, wie Sie wollen, nach einem beliebigen Zeitplan und mit unterschiedlichen Richtlinien a la "gzip 7 Tage, dann rm" pro Datei.

Untersuchen Sie /etc/logrotate.d .

2voto

Duke Punkte 6756

Hier ist mein Capistrano-Installationsverfahren. Ich kopiere sie in die Deploy-Datei und führe sie nur aus, wenn ich die Serverumgebung für die Anwendung erstelle oder wenn es irgendwelche Änderungen an der Logrotate-Konfiguration gibt.

namespace :setup do
  task :install_logrotation, :roles => :app do
    logrotate = <<-BASH 
      #{shared_path}/log/*.log {
        daily
        missingok
        rotate 30
        compress
        size 5M
        delaycompress
        sharedscripts
        postrotate
          #{signal_unicorn("USR1")}
        endscript
      }
    BASH
    tmpfile = "/tmp/#{application}.logrotate"

    put(logrotate, tmpfile)
    run "#{sudo} chown root:root #{tmpfile} && #{sudo} mv -f #{tmpfile} /etc/logrotate.d/#{application}"
  end
end

(Oh, und signal_unicorn macht einfach ein "#{sudo} kill -s #{signal} cat #{unicorn_pid} "; USR1 weist es an, alle Dateien neu zu laden, damit sie an die neue Protokolldatei angehängt werden können).

Viel Spaß!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X