Wir haben mehrere Anwendungen, die ihre eigenen Nur-Text-Protokolldateien generieren, die ich zur zentralen Protokollierung an einen Remote-Syslog-Server weiterleiten möchte. Ich habe root
auf diesen Computern keinen Zugriff und kann auch nicht neu konfigurieren syslog
, um die Ausgabe auf einen Remotecomputer umzuleiten.
Ich habe einige Lösungen online gefunden, aber es handelt sich hauptsächlich um hausgemachte Bash-Skripte, und ich suche nach etwas Robusterem, das für die Implementierung in einer potenziell hochvolumigen Produktionsumgebung geeignet ist.
Am besten etwas, das mit Blick auf einen kleinen Platzbedarf entwickelt wurde, einen Hintergrunddämon, der weiterläuft, mit vielen Zeilen mithalten kann usw. - Welche Lösungen sind derzeit verfügbar?
Antworten:
Sie haben bereits "Bash-Skripte anderer Leute" abgelehnt, aber dies ist eine ziemlich häufige Lösung - eine kreative Verwendung des
logger
Befehls kann einer Datei folgen und ihren Inhalt an eine andere Stelle senden.Ich persönlich würde dies jedoch nicht in einer Produktionsumgebung tun.
Eine bessere Option, die weniger Scripting-Hackery erfordert, ist die Verwendung
rsyslogd
des Textdatei-Eingabemoduls wie yoonix. Dies ist eine recht anständige Lösung, obwohl während einer Dateirotation und wenn Sie sich auf einem Linux-System mit befinden, möglicherweise Zeilenverluste auftreten könnenrsyslog
Als Syslog-Daemon ist nicht viel zusätzliche Arbeit erforderlich.syslog-ng
unterstützt auch eine Dateieingabequelle mit ähnlichen Funktionen wiersyslog
's.IMHO ist die beste Lösung - obwohl eine Änderung der Anwendung erforderlich ist, die diese Protokolle generiert - die direkte Protokollierung bei syslog. Sie möchten keine Zwischenschritte, Dateien usw.
syslog
ausführen - ist der SYStem LOGger, und Dinge, die Protokolle auf einer Unix-Plattform schreiben, sollten sie an syslog senden.Die Implementierung bleibt leider als Übung für den Leser (und Anwendungsentwickler) und ist möglicherweise nicht möglich, wenn Ihre Entwickler nicht vorhanden, faul oder inkompetent sind.
quelle
rsyslog
derzeit auf dem System ausgeführte Konfiguration ändern . Sie sollten NICHT zwei Syslog-Daemons ausführen. Um nicht unhöflich zu sein, müssen Sie aufhören zu versuchen, es falsch zu machen *: Jede richtige Lösung für dieses Szenario erfordert administrative (Root-) Aktionen auf dem Server oder Änderungen an der App. Sie müssen sich dieser Realität stellen und sich mit jeder Gruppe in Ihrer Organisation befassen, die auf den betreffenden Systemen verwurzelt ist. Andernfalls ist diese Frage nicht zum Thema (Sie versuchen, die Richtlinien Ihrer Organisation zu umgehen) ....Sie können logstash mit der Dateieingabe und der Syslog- Ausgabe verwenden.
Erstellen Sie beispielsweise eine Konfiguration mit der Datei (oder den Dateien), die Sie überwachen möchten, und Ihren Syslog-Serverinformationen.
file-to-syslog.conf:
Das Startprotokoll mit
quelle
Ich habe mich zusammen
tail.c
undlogger.c
in ein einziges kompiliertes Programm (binär) gehackt , das leicht, schnell und stabil ist. Solange es Lesezugriff auf die Protokolldatei (en) hat, funktioniert es ohne Root-Rechte.Ich habe auch einige Verbesserungen am nativen Logger vorgenommen und eine neue (optionale) Funktion zum Einfügen einer Textzeichenfolge am Anfang jeder Protokollzeile hinzugefügt, bevor diese an den Protokollserver gesendet wird. Das Ergebnis ist ein Programm, das von selbst ausgeführt werden kann, ohne dass Shell-Pipes verwendet werden müssen (dh nicht müssen
tail logfile | logger
). Es wird für immer ausgeführt, bis es explizit beendet wird oder ein Fehler beim Schreiben in den Netzwerk-Socket auftritt. Es wird sogar weiter ausgeführt, wenn die Protokolldatei gedreht wird oder sogar verschwindet (es wird nur weiter geprüft, ob die Datei erneut angezeigt wird.)Es ist einfach zu bedienen: Geben Sie einfach eine oder mehrere Protokolldateien zum Überwachen an, und jedes Mal, wenn eine neue Zeile in die Datei geschrieben wird, wird eine Kopie dieser Zeile an den von Ihnen angegebenen lokalen oder Remote-Syslog-Server gesendet. Plus die zusätzliche Textzeichenfolge, wenn Sie diese Option verwenden.
Ich habe das Programm bereits im Dezember fertiggestellt, aber darauf gewartet, dass Yahoo das Urheberrecht übernimmt und es zur Verfügung stellt, was sie jetzt getan haben. (Ich habe es als Teil meines Jobs bei Yahoo geschrieben).
Informationen zum Filelogger-Programm und Download-Link:
quelle
Es gibt eine Reihe von Möglichkeiten, dies zu beheben. Aber die sehr, sehr erste , was Sie tun sollten , ist: vorwärts , die Protokolle mit syslog selbst .
Syslog (und viele Ersatzprodukte für Syslog) verfügen über integrierte Funktionen zum Weiterleiten der Protokollierung an einen anderen Syslog-Server unter einer anderen Adresse. Sie können dies einfach tun, indem Sie die Konfigurationsdatei ändern und die Adresse anhängen, an die die Einrichtung weitergeleitet werden soll. Fügen Sie diese Zeile beispielsweise hinzu zu:
... würde alle Einrichtungen an die Maschine unter 192.168.1.1 weiterleiten , auf der (hoffentlich) der Dienst ausgeführt wird. Das Beispiel, das ich hier gebe, ist für rsyslog, den Standard-Syslog-Server unter Debian, obwohl er für viele andere funktionieren sollte. Konsultieren Sie die Dokumentation für Ihre Implementierung von Syslog mit
man syslog
und sehen Sie, was darin über "Weiterleitung" steht.Der Remote-Syslog-Server kann beliebig sein. Es gibt sogar Produkte wie Splunk , die diese Protokolle mit einem Web-Dashboard, einer Suche, ereignisgesteuerten Benachrichtigungen usw. in einer einzigen Ansicht zusammenfassen. Weitere Informationen finden Sie hier: http://www.splunk.com/ If das entspricht nicht Ihren Bedürfnissen, Sie können etwas anderes verwenden. Es gibt sogar Syslog-Server, die in eine SQL-Datenbank kopiert werden!
Sicher, Sie könnten Ihr eigenes Skript / Programm / Service schreiben, um dies für Sie zu tun, aber warum das Rad neu erfinden, wenn es sowohl für Sie erledigt als auch Ihnen bereits gegeben wurde?
Bearbeiten: Also ging ich zurück und las die Frage erneut und bemerkte mehrere Kommentare. Hört sich an wie:
Wenden wir uns also nacheinander an:
root
um die Protokollierung einzurichten. Wir benötigen nur Zugriff auf die Syslog-API.root
ist nicht erforderlich, um in das Syslog zu schreiben; Wenn dies der Fall wäre, könnten alle Dienste, die Berechtigungen löschen, keine Diagnose in die Protokolldateien schreiben.Betreff: Text-Dumps, das ist normal. Sie sollten jedoch in der Lage sein, eine Subshell zu verwenden, um die Ausgabe von STDERR und STDOUT an ein Programm weiterzuleiten, das die Syslog-API aufruft. Dies ist keine Raketenwissenschaft, es ist alles andere als spröde und es ist gut dokumentiert. Tatsächlich ist dies einer der Gründe, warum die Ausgabeumleitung überhaupt existiert. Ein einfacher Befehl, der in ein einzelnes Shell-Skript geworfen werden könnte, wäre:
(meine-Anwendung 2> & 1 | mein-Syslog-Shunt) &
Wenn Sie den Quellcode Ihrer Anwendung ändern können, sollten Sie einen Shunt in die Anwendung schreiben, um die Textausgabe anstelle einer Nur-Text-Datei in Syslog zu speichern. Das sollte nicht zu schwer sein; Alles, was Sie tun, ist, die Zeilen, die Sie ausgeben würden, zu nehmen und sie mit einem Anruf zu versehen. Jedoch....
Möglicherweise haben Sie überhaupt keinen Zugriff auf den Quellcode, daher können Sie dies nicht tun. Was bedeutet, dass so etwas wie # 3 oben gut funktionieren würde.
quelle
Runtime.exec("logger ..."
) OK, danke.Ich beantworte meine eigene Frage.
Swatch hat möglicherweise funktioniert, aber ich konnte das Sys :: Syslog-Modul von Perl nicht auf dem Host zum Laufen bringen, und der auf dem Host installierte / usr / bin / logger unterstützt die Protokollierung auf dem Remote-Server nicht (util-linux-ng- 2.17.2).
Als erstes habe ich den Quellcode für util-linux-2.20.1 heruntergeladen, für den das Logger-Programm die Remote-Protokollierung unterstützt. Beim Testen stellte sich heraus, dass die Anzahl der in der Protokollzeile zulässigen Zeichen begrenzt ist. Beim Durchsuchen des Quellcodes fand ich eine fest codierte Beschränkung auf 400 Zeichen. (Wenn Sie mir nicht glauben, führen Sie "strings / usr / bin / logger | grep 400" auf einem beliebigen Linux-System aus.)
Dieses Limit ist für die Apache-Protokollierung (einschließlich NodeJS) nicht akzeptabel. Daher habe ich den Code geändert und das Limit auf 4096 erhöht. Während ich dabei war, habe ich auch eine neue Befehlszeilenoption hinzugefügt, mit der eine Option eingefügt werden kann Textzeichenfolge am Anfang jeder Protokollzeile. Ich habe dies getan, weil die NodeJS-Protokolle nicht den Hostnamen enthalten, wie man es in Apache sehen würde.
Zu diesem Zeitpunkt konnte ich ein Shell-Skript mit "tail -F -n 0 [logfile] | ./modified_logger ...." ausführen und es funktionierte. Ich hatte jedoch einige Bedenken, dies von Supervise (Daemontools) oder sogar im Hintergrund aus auszuführen, denn wenn die eine oder andere Seite des Rohrs endet, besteht das Risiko, dass das gesamte Rohr endet. Ich hatte auch Bedenken (wenn auch nicht getestet) hinsichtlich der Leistung.
Daher habe ich beschlossen, die Tail-Funktionalität mit der Logger-Funktionalität in einer einzigen ausführbaren Binärdatei zu kombinieren, die die Verwendung von Unix-Pipes oder externen Programmen umgehen würde. Ich habe dies getan, indem ich tail.c von gnu coreutils gehackt und das, was ich brauche, in das modifizierte Logger-Programm integriert habe.
Das Ergebnis ist eine neue Binärdatei (117 KB), die ich "Filelogger" nenne und die kontinuierlich eine oder mehrere Dateien überwacht und jede neue Zeile entweder über UDP oder TCP in einem lokalen oder Remote-Syslog protokolliert. Es wirkt wie ein Zauber. Ich konnte ein kleines Benchmarking durchführen und es protokolliert ungefähr 17.000 Zeilen (1,8 MB) in ungefähr 3 Sekunden über Subnetze mit einem VLAN und ein paar physischen Switches zwischen ihnen auf einem Remote-Server, auf dem syslog-ng ausgeführt wird.
Um das Programm auszuführen, gehen Sie wie folgt vor (entweder im Vordergrund, im Hintergrund oder überwacht mit Daemontools):
./filelogger -t 'access' -d -p local1.info -n [entfernter Loghost] -u / tmp / ignoriert -a $ (Hostname) / tmp / myfile1 / tmp / myfile2 ...
/ tmp / myfile1 und / tmp / myfile2 sind die zu überwachenden Dateien.
Das "-a" ist die neue Option, die ich hinzugefügt habe. In diesem Fall füge ich den lokalen Hostnamen am Anfang jeder Protokollzeile ein.
Diese Lösung war genau die Art von Lösung, nach der ich gesucht habe, als ich die Frage gestellt habe, und wie sich herausstellte, gab es sie erst, als ich sie selbst gemacht habe. :) :)
quelle