2013-02-17 6 views
5

I Rubin Standard-Logger sind mit, ich Dreh täglich einen will, so in meinem Code ich habe:Erstellen nur ein Protokoll mit täglich Ruby-Standard Logger

Logger.new("#{$ROOT_PATH}/log/errors.log", 'daily') 

Es ist perfekt funktioniert, aber es schaffte zwei Dateien errors.log.20130217 und errors.log.20130217.1.

Wie kann ich es erzwingen, nur eine Datei pro Tag zu erstellen?

+2

Es klingt wie, Sie erstellen einen neuen Logger in Ihrer Umgebungsdatei. Gibt es jedoch bereits eine bestehende? Haben Sie nach der Erstellung der neuen Logger-Zeile auch Ihre Rails-App neu gestartet? – kobaltz

+1

Es ist schwierig, genau zu verstehen, was Sie wollen, aber haben Sie einen Blick auf "[logrotate] (http://linuxcommand.org/man_pages/logrotate8.html)" geworfen, was ein Standard-Teil von * nix ist? Es kann Protokolle für viele verschiedene Kriterien auf verschiedene Arten drehen. –

+0

@Kobaltz, ja, ich habe mehr als eine Prozesse auf das gleiche Protokoll zugreifen, und ja, ich habe die Schienen neu gestartet, aber bitte beachten Sie, die meisten meiner Protokolle sind nicht einmal in Schienen statt Ruby Arbeiter, der Zinn Mann, ist es einfach, ich möchte nur eine Log-Datei anstelle von mehreren Logs pro Tag –

Antwort

11

Ihr Code ist korrekt für eine lange laufende Anwendung.

Was passiert, ist, dass Sie Code mehr als einmal an einem bestimmten Tag ausführen.

Wenn Sie es das erste Mal ausführen, erstellt Ruby eine Protokolldatei "errors.log".

Wenn sich der Tag ändert, benennt Ruby die Datei in "errors.log.20130217" um.

Aber irgendwie haben Sie den Code erneut ausgeführt, vielleicht haben Sie zwei Anwendungen (oder Prozesse oder Worker oder Threads), die ähnlichen Code verwenden, und Ihr Logger sah bereits den Dateinamen "errors.log.20130217" existiert.

Ihr Logger wollte nicht, diese Datei verprügeln, aber immer noch zu einem Datum benennen „errors.log“ benötigt, so dass der Logger stattdessen einen anderen Dateinamen „errors.log.20130217.1“ erstellt

zu löse dies, führe deinen Code nur einmal aus.

Wenn Sie mehrere Apps mit dem Namen "foo" und "bar" ausführen, verwenden Sie Log-Dateinamen wie "foo-errors.log" und "bar-errors.log". Oder wenn Sie mehrere Worker verwenden, geben Sie jedem Worker einen eigenen Protokolldateinamen (z. B. mithilfe der Prozess-ID des Worker oder des Worker-Pool-Array-Index, oder wie auch immer Sie Ihre Worker verfolgen).

Wenn Sie dies wirklich mit dem Ruby Logger lösen möchten, müssen Sie den Logger #shift_log_period überschreiben, damit er kein Suffix ".1" wählt. Sie könnten Logger ableiten und Ihre abgenutzte #shift_log_period schreiben, um festzustellen, ob es eine vorhandene Protokolldatei für das Datum gibt, und wenn ja, verwenden Sie sie, anstatt die Datei umzubenennen.

Dies ist der Code, es aus dem Logger verursacht:

def shift_log_period(period_end) 
    postfix = period_end.strftime("%Y%m%d") # YYYYMMDD 
    age_file = "#{@filename}.#{postfix}" 
    if FileTest.exist?(age_file) 
    # try to avoid filename crash caused by Timestamp change. 
    idx = 0 
    # .99 can be overridden; avoid too much file search with 'loop do' 
    while idx < 100 
     idx += 1 
     age_file = "#{@filename}.#{postfix}.#{idx}" 
     break unless FileTest.exist?(age_file) 
    end 
    end 
    @dev.close rescue nil 
    File.rename("#{@filename}", age_file) 
    @dev = create_logfile(@filename) 
    return true 

Es gibt keine Lösung (AFAIK) die Ruby-Logger verwenden, mit seinem eingebauten in Rotator, Protokolle durch mehrere Anwendungen geschrieben zu verwalten (auch bekannt als Arbeiter , Prozesse, Threads) gleichzeitig. Dies liegt daran, dass jede der Anwendungen ihre eigene Protokolldatei-Handle erhält.

Alternativ verwenden Sie einen der guten Logrotator Werkzeuge, wie logrotate wie von der Tin Man Benutzern in der Frage Kommentaren vorgeschlagen: http://linuxcommand.org/man_pages/logrotate8.html

Im Allgemeinen wird logrotate Ihre beste Wette IMHO sein.

+0

Mann, du bist absolut richtig hier, ich benutze das gleiche Protokoll von mehr als einem Arbeiter, und manchmal starte ich die Prozesse neu, aber können Sie mehr darüber erklären Präfix "" # {$ ROOT_PATH} /log/myapp-errors.log "Sie vorgeschlagen? Vielen Dank für Ihre Hilfe –

+0

Gern geschehen. Ich habe mehr Informationen für Sie. – joelparkerhenderson

+0

Ich habe ein Problem, dass ich nicht neu starten kann Anwendung täglich und ich muss täglich eine Logger-Datei erstellen Gibt es eine Lösung dafür in Ruby oder muss ich mit der Option logrotate gehen? –