Rotation des Ruby on Rails-Produktionsprotokolls

172

Was ist der beste Weg, um die Protokollrotation in einer Ruby on Rails-Produktions-App zu aktivieren?

Wird logrotate auf dem Hosting-Server verwendet oder gibt es eine Reihe von Optionen, die beim Initialisieren von logger über die App verwendet werden können?

cnicolaou
quelle
Ich sehe, dass es bereits eine Antwort darauf gibt, aber ich wollte fragen, wie Ihre Umgebung ist. Ich verwende die Methode syslog + logrotate selbst, aber offensichtlich hat die Art der Umgebung (ob dediziert, gemeinsam genutzt; welche Art von * ix-Betriebssystem wird gehostet oder ist eine andere usw.) hier einen Einfluss.
ylluminate

Antworten:

203

Option 1: Syslog + Logrotate

Sie können Schienen konfigurieren, um die Systemprotokolltools zu verwenden.

Ein Beispiel in config / environment / Production.rb .

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

Auf diese Weise melden Sie sich bei syslog an und können die Protokolle mit Standardwerkzeugen für die Protokollierung drehen.

Option 2: normale Rails-Protokolle + Logrotate

Eine andere Möglichkeit besteht darin, logrotate einfach so zu konfigurieren, dass die von Schienen hinterlassenen Protokolle erfasst werden. Unter Ubuntu und Debian wäre das zum Beispiel in einer Datei namens /etc/logrotate.d/rails_example_com.

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

Gemäß den folgenden Vorschlägen wird die Verwendung in Rails empfohlen, um copytruncatezu vermeiden, dass die Rails-App neu gestartet werden muss.

Bearbeiten: "Sharedscripts / Endscript" entfernt, da sie hier nicht verwendet werden und laut Kommentar Probleme verursachen. Und create 640 root admgemäß dem vorgeschlagenen Kommentar entfernt.

berkes
quelle
3
Sollte die Zeile "config.logger = SyslogLogger.new" in config / environment / Production.rb auskommentiert bleiben, um logrotate verwenden zu können, oder sollte sie nicht kommentiert werden?
Robertwbradford
2
Es sollte auskommentiert bleiben, damit die Protokolldateien (zum Beispiel) geschrieben werden in: /var/www/myrailsapp/current/log/production.log
Luca Spiller
3
Wenn Sie die logrotateLösung verwenden, lohnt sich die Antwort von @ amit-saxena - schlägt die Verwendung von copytruncateüber der createRichtlinie vor.
Tom Harrison
3
Wenn Sie verwenden copytruncate, createhat dies keine Auswirkung, daher sollten Sie es wahrscheinlich aus Ihrem Beispiel entfernen
Michaël Witrant
3
Möglicherweise müssen Sie auch die Zeile su your_rails_user your_rails_groupmit dem Eigentümer und der Gruppe Ihrer Protokolldateien hinzufügen (dh die des Rails / Passenger-Prozesses), oder (neuere Versionen von?) Logrotate beschweren sich möglicherweise über Berechtigungen.
Oseiskar
56

Wenn Sie logrotate verwenden, können Sie eine der unten gezeigten Optionen auswählen, indem Sie eine conf-Datei im Verzeichnis /etc/logrotate.d/ ablegen.

# 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
}

Oder

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

Bitte beachten Sie, dass copytruncate eine Sicherungskopie des aktuellen Protokolls erstellt und dann die Protokolldatei für das weitere Schreiben löscht. Die Alternative besteht darin, create zu verwenden, um die Rotation durchzuführen, indem die aktuelle Datei umbenannt und anschließend eine neue Protokolldatei mit demselben Namen wie die alte Datei erstellt wird. Ich empfehle dringend , copytruncate zu verwenden, es sei denn, Sie wissen, dass Sie erstellen müssen. Der Grund dafür ist, dass Rails möglicherweise weiterhin auf die alte Protokolldatei verweist, obwohl sich ihr Name geändert hat, und dass möglicherweise ein Neustart erforderlich ist, um die neue Protokolldatei zu finden. copytruncate vermeidet dies, indem dieselbe Datei wie die aktive Datei beibehalten wird.

amit_saxena
quelle
Aber sollte ich die Schienen nicht jedes Mal neu starten, wenn logrotate ausgeführt wird?
lzap
2
Schneiden Sie die ursprüngliche Protokolldatei nach dem Erstellen einer Kopie ab, anstatt die alte Protokolldatei zu verschieben und optional eine neue zu erstellen. Sie kann verwendet werden, wenn ein Programm nicht angewiesen werden kann, seine Protokolldatei zu schließen, und daher möglicherweise weiter schreiben (anhängen) die vorherige Protokolldatei für immer. Beachten Sie, dass zwischen dem Kopieren und Abschneiden der Datei eine sehr kleine Zeitspanne liegt, sodass möglicherweise einige Protokolldaten verloren gehen. Wenn diese Option verwendet wird, hat die Option zum Erstellen keine Auswirkung, da die alte Protokolldatei an Ort und Stelle bleibt.
lzap
1
Sie müssen Rails nicht neu starten, wenn Sie copytruncate verwenden, da es immer noch auf dieselbe Protokolldatei verweist.
amit_saxena
Müssen Sie in der Konfiguration angeben, wann die Protokolle gedreht werden sollen? wie "wöchentlich" oder "Größe = 20M"? Oder können Sie das weglassen, wenn Sie logrotate nur manuell ausführen möchten?
Damainman
1
Ich bin nicht sicher, ob ich Ihre Frage richtig verstanden habe, aber Sie müssen ein Kriterium für die automatische Protokollrotation angeben. Wenn Sie nicht möchten, dass es automatisch erfolgt, legen Sie die Datei nicht im Verzeichnis /etc/logrotate.d/ ab, sondern bewahren Sie sie an einem anderen Ort auf. Sie können dann ausführen, logrotate --force $CONFIG_FILEindem Sie den Speicherort der Konfigurationsdatei angeben, um sie manuell auszuführen.
amit_saxena
31

Für Rails 5 musste ich Folgendes tun, um die Protokollgröße zu begrenzen und die Serverausgabe in der Konsole nicht zu ändern:

Wenn Sie laut Dokumentation die Größe des Protokollordners begrenzen möchten, fügen Sie diese in Ihre Umgebungsdatei ein ('development.rb' / 'Production.rb').

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

Dadurch werden Ihre Protokolldateien niemals größer als 50 MB. Sie können die Größe nach Ihren Wünschen ändern. Die '1' im zweiten Parameter bedeutet, dass 1 historische Protokolldatei beibehalten wird, sodass Sie bis zu 100 MB Protokolle haben - das aktuelle Protokoll und den vorherigen Block von 50 MB.

Quelle für diese Lösung .

Fremder
quelle
2
Das erste Argument ist einfach der Dateiname, dh 'log / development.log'. Also würde ich einen längeren, aber transparenten Weg bevorzugen. Anstelle von config.paths['log'].firstwürde ich setzenRails.root.join('log', "#{Rails.env}.log")
Mikhail Chuprynski
1
@ ZiaUlRehmanMughal Ja, es funktioniert mit Rails 4. Ich verwende Rails 4.2.3, mit Konfiguration wie config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
folgt
1
Um dies leichter lesbar zu machen, ist es erwähnenswert, dass Sie sich auf die ActiveSupport-Byterweiterungen verlassen können: 50.megabytesist dasselbe wie 50 * 1024 * 1024, aber viel einfacher zu verstehen. Weitere Informationen finden Sie unter ActiveSupport-Kernerweiterungen .
Pierre-Adrien Buisson
1
Bin nach einigem googeln wieder hier (Programmiererleben: D). Ich habe mich gefragt, ob wir diese Zeile so konfigurieren können, dass alle Protokolldateien im Protokollordner gedreht werden. Anscheinend dreht diese Linie nur die erste Linie.
Zia Ul Rehman Mughal
Beachten Sie, dass dadurch nur Rails.application.config.paths['log'].first
Ihre
5

Wenn Sie für Rails 5 eine tägliche Protokollrotation wünschen, benötigen Sie nur Folgendes:

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

Nach der Dokumentation können Sie verwenden daily, weeklyoder monthly.

Rael Gugelmin Cunha
quelle
2

Für jedes Protokoll: Rails-Protokoll, Rpush-Protokoll, ... Sie können Folgendes in Ihrer Konfigurationsdatei des Dienstes verwenden:

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

Dies bedeutet: Speichern Sie nur 1 vorherige Protokolldatei nach dem Teilen. Hauptprotokollgröße nie über 20 MB.

ThienSuBS
quelle
-9

Aktivieren Sie diese Option, um Protokolle mithilfe von Rails Logglier an das Loggly zu senden. Schienenversion ist 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
quelle
Bitte schlagen Sie mir etwas vor, was zu tun ist ... dieser Code funktioniert nicht
riya khana
Rails Version ist 4.1.0 & Ruby Version ist 2.1.1
Riya Khana