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.
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
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. –
@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 –