Ich möchte eine Rotation von Nginx-Protokollen erreichen, die:
- würde ohne zusätzliche Software funktionieren (dh - am besten ohne "logrotate")
- würde gedrehte Dateien mit Namen basierend auf dem Datum erstellen
Der beste Ansatz ist der von PostgreSQL - dh in seiner Konfigurationsvariablen log_filename kann ich% Y-% m-% d im Strftime-Stil angeben und er ändert automatisch das Anmeldedatum (oder die Uhrzeit).
Ein weiterer Ansatz von Apache - das Senden von Protokollen per Pipe an das Programm rotatelogs.
Soweit ich suchen konnte - gibt es keinen solchen Ansatz. Alles, was ich tun kann, ist, logrotate mit der Option dateext zu verwenden, aber es hat seine eigenen Nachteile, und ich würde lieber etwas verwenden, das in PostgreSQL wie | rotatelogs oder log_filename funktioniert.
Antworten:
Während sich die Welt darüber teilt, ob die bescheidene Named Pipe ein Freund oder ein Feind ist, ist es wahrscheinlich die einfachste Lösung für Ihr Problem. Es hat ein paar Nachteile (Sie müssen die Pipes im Voraus erstellen), aber es macht einen Cron überflüssig und Sie können den Protokollierungs-Pipefilter Ihrer Wahl verwenden.
Hier ist ein Beispiel für die Verwendung von cronolog für
access.log
:/var/log/nginx
, also werde ich auch meine Pfeifen dort ablegen. Der Name liegt bei Ihnen; Ich hänge an.fifo
, und es istaccess.log
so, dass meins bei sein wird/var/log/nginx/access.log.fifo
.Erstellen Sie eine Named Pipe für die Protokolldatei:
Konfigurieren Sie
nginx.conf
, um das Protokoll auf die soeben erstellte Pipe zu richten:Ändern Sie Ihr init.d-Skript, um den Protokollrotator zu starten, der die Pipe abhört, bevor wir den Server starten:
Eine ähnliche Befehlszeile wird verwendet,
rotatelogs
falls Sie dies vorziehencronolog
- Informationen zur Syntax finden Sie in den zugehörigen Dokumenten.Wenn Ihre Distribution eine hat
start-stop-daemon
, sollten Sie stattdessen diese verwenden, da sie theoretisch über das spezielle Wissen über Ihre Plattform verfügt und sich umpkill
Sie kümmert . Wickeln Sie einfach den Befehl in einem Skript, und übergeben Sie es als--exec
zustart-stop-daemon
Ihrerinit.d/nginx
.quelle
Ich habe ein einfaches Programm, datelog, geschrieben, um allgemeine Protokolle basierend auf dem protokollierten Datum zu teilen, im Gegensatz zur aktuellen Systemzeit, wenn die Protokollzeile vom Programm gesehen wird. Dies kann oder kann nicht genau das sein, was cronolog oder ein anderer Protokollteiler bereits tut, aber es war schneller, meine eigenen zu schreiben, als herauszufinden, was andere tun.
Unter Verwendung von Jahr und Monat in der protokollierten Anforderung wird die Zeile dann in eine Datei oder Pipe geschrieben, die das aus den protokollierten Daten berechnete JJJJMM enthält. Ja, dies ist etwas spezifisch für das übliche Protokollformat. Es wird angenommen, dass das erste [das Datum begrenzt. Vorsicht vor IPv6-Adressen. :)
Für die Protokollanalyse ist es wichtig, dass jedes Protokoll wirklich nur die Anforderungen für den jeweiligen Monat enthält. Idealerweise sollte jedes Protokoll vollständig sein, um korrekte Analyseergebnisse zu erzielen. Es reicht nicht aus, den Dateinamen anhand der aktuellen Zeit im Protokollteiler zu ermitteln, da eine langsame Anforderung ab 23:59:59 dann für den falschen Monat in der Protokolldatei endet.
Ich verwende dies mit nginx über ein benanntes FIFO, das vor dem Start von nginx auf Existenz überprüft wird. Beachten Sie, dass es im Programm einen Kompromiss zwischen Fehlererkennung und gepufferter Ausgabe gibt, bei dem die Datenprotokollierung derzeit aus Leistungsgründen die gepufferte Ausgabe bevorzugt. Stellen Sie daher sicher, dass Ihr Setup wirklich funktioniert, insbesondere bei Verwendung von Shell-Pipes, damit keine Protokolldaten verloren gehen .
Quellcode: http://stuge.se/datelog.c
Bitte senden Sie mir Feedback und natürlich Patches!
quelle
Sie können dies mit einem einfachen Bash-Skript und Cron erreichen:
Weitere Informationen zum Einrichten von crontab usw. finden Sie hier: Rotieren von Nginx-Protokolldateien über Cron
quelle
Ich fürchte, ich verstehe Ihre Frage nicht wirklich: Da Nginx keine eingebaute Logrotation unterstützt, müssen Sie sich für so etwas entscheiden
Irgendwo in /etc/cron.daily (Sie müssen die oben genannten Dateinamen natürlich mit vollständigen Pfadnamen versehen) oder die Hilfsprogramme apache2 installieren, um auf rotatelogs zugreifen zu können.
quelle