Linux: Wie sende ich neue Zeilen in Protokolldateien an Remote-Syslog?

8

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 rootauf 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?

Michael Martinez
quelle
3
Haben Sie sich das Eingabemodul für Textdateien für rsyslog angesehen?
Yoonix
@yoonix: Nein, habe ich nicht, aber ich werde :)
Michael Martinez
3
Ähm, Syslog kann an entfernte Syslog-Server senden. Konfigurieren Sie Ihr lokales Syslog so, dass es an einen Remote-Server gesendet wird. Greifen Sie dann über die Standard-Syslog-Aufrufe oder mithilfe von Logger oder Ähnlichem auf Ihr lokales Syslog zu.
Zoredache
4
Warum schreibst du deine Protokolldateien nicht in eine Named
?
3
Sie sollten die App nicht ändern müssen, sondern nur eine Named Pipe mit demselben Namen wie die Protokolldatei, in die die App schreibt, einfügen.
user9517

Antworten:

13

Sie haben bereits "Bash-Skripte anderer Leute" abgelehnt, aber dies ist eine ziemlich häufige Lösung - eine kreative Verwendung des loggerBefehls 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 rsyslogddes 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önnen rsyslogAls Syslog-Daemon ist nicht viel zusätzliche Arbeit erforderlich.

syslog-ngunterstützt auch eine Dateieingabequelle mit ähnlichen Funktionen wie rsyslog'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. syslogausfü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.

voretaq7
quelle
7
@MichaelMartinez Sie würden die rsyslogderzeit 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) ....
voretaq7
5
@Michael Das alles sagt uns, dass jemand versucht, das falsche Team zu zwingen, das Update zu implementieren.
Andrew B
4
@MichaelMartinez imho, das klingt nach einem ziemlich schnellen Weg zu lähmenden technischen Schulden.
Sirex
2
@ Sirx. Sei es was es mag, es ist der Weg der Dinge. Ich arbeite in einer Organisation, die Zehntausende von Menschen beschäftigt, von denen die meisten technisch sind (Ingenieure, Entwickler, Ops usw.)
Michael Martinez
5
Ich vermute. Im Allgemeinen habe ich langfristig festgestellt, dass es keine Medaillen gibt, wenn man selbstverschuldete Schlachten gewinnt. Wenn die technische Verschuldung auf den Punkt kommt, wirkt sie sich ironischerweise auf das Geschäft aus. Nach meiner Erfahrung neigen die Leute, die fleißig daran gearbeitet haben, dem Elefanten im Raum auszuweichen, dazu, die Dose zu tragen. Also würde ich sagen, bedecke deinen Arsch und lass jemanden zustimmen, der die Nachteile davon schreibt.
Sirex
6

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:

input { file { path => "/var/log/kern.log" } }
output {
    syslog {
        facility => "kernel"
        host => "syslog.example.com"
        port => 514
        severity => "informational"
    }
}

Das Startprotokoll mit

java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf
Sciurus
quelle
+1. Wenn die Verwendung der Dateieingabe von rsyslog keine Option ist, ist logstash die nächstbeste Sache. In vielerlei Hinsicht ist es auf lange Sicht besser.
Sirex
Ich bin damit nicht vertraut. Wenn es das tut, was ich brauche, hätte es mir die Mühe erspart, Coreutils und Util-Linux zu hacken.
Michael Martinez
Ja, die Konfiguration wird ein bisschen so aussehen: pastebin.com/xeC9hxD3
Sirex
sieht aus wie ein sehr cooles Tool, ist aber definitiv übertrieben für das, was ich hier brauche. logstash ist ein eigener Dienst mit Weboberfläche, erfordert Java usw. Ich werde weiterhin meinen Filelogger verwenden, der leichtgewichtig, klein und platzsparend ist. ... Aber danke, dass Sie logstash vorgeschlagen haben, da ich in Zukunft in anderen Situationen einen Bedarf dafür sehen kann!
Michael Martinez
Ja, es ist ein Glas voll jruby Werkzeug. Die GUI ist eigentlich Kibana, die einfach verpackt ist, aber eigentlich ein separates Projekt ist, sodass sie nicht nur zum Parsen von Nachrichten benötigt wird. Es ist im Grunde ein Schweizer Taschenmesser. Sie definieren Ein- und Ausgänge und in der Mitte können Sie optional die Protokolle durchsuchen, wodurch sie einen Kontext erhalten. - Es ist wahrscheinlich ein Overkill für Sie, es sei denn, Sie möchten Elasticsearch auch für Ihre Protokolldaten verwenden.
Sirex
4

Ich habe mich zusammen tail.cund logger.cin 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:

Michael Martinez
quelle
@slm: Ich habe umgeschrieben, wie Sie angefordert haben
Michael Martinez
Sehr nützlich, danke Michael. Gibt es eine Chance, dass Sie es für die Installation von debian apt-get verpacken?
Joelparkerhenderson
@joelparkerhenderson. Hallo Joel. Leider wahrscheinlich nicht, weil ich nicht mit Debian arbeite. Haben Sie versucht, die Binärdatei auf Ihr System zu kopieren und zu prüfen, ob sie ausgeführt wird?
Michael Martinez
1

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:

*.*    @192.168.1.1

... 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 syslogund 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:

  1. Sie möchten Ihre Anwendungsprotokolle zusammenfassen
  2. Sie haben keinen Zugriff auf root
  3. Ihre Anwendung (en) geben nur Text irgendwo aus
  4. Ihre Anwendung (en) können nicht in das lokale Syslog schreiben
  5. Sie haben keine Kontrolle über Ihren Anwendungsquellcode

Wenden wir uns also nacheinander an:

  1. syslog sollte Protokolle zusammenfassen. Sie können alles verwenden, was Sie möchten, aber es gibt einen Grund, warum es das schon lange gibt. Es ist gut getestet, gut getestet, gut dokumentiert, bekannt und wird für die meisten * nix-Plattformen in der einen oder anderen Variante nahezu universell unterstützt.
  2. Wir benötigen keinen Zugriff, rootum die Protokollierung einzurichten. Wir benötigen nur Zugriff auf die Syslog-API. rootist 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.
  3. 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) &

  4. 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....

  5. 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.

Avery Payne
quelle
zwei Gründe: (1) einfach, weil, wie bereits erwähnt, kein Root oder Sudo auf den fraglichen Boxen vorhanden war. (2) "logger" selbst kann an den Remote-Server weiterleiten, hat jedoch eine Beschränkung von 400 Zeichen pro Protokollzeile, was für Apache-Protokolle nicht geeignet ist. Wie auch immer, ich habe bereits eine benutzerdefinierte Lösung zusammengestellt, die genau das tut, was ich brauchte (und auch "Logger" verbessert). Siehe meine Antwort hier für "filelogger"
Michael Martinez
4. Syslog ist nicht nur ein Dateistream, in den ich Text öffnen und schreiben kann. Der Shunt, den ich schreibe, müsste einen Socket für den UDP-Port öffnen, den Syslog abhört.
Noumenon
1
@ Noumenon, Ihre Absicht ist mir nicht ganz klar, aber ich gehe davon aus, dass Sie die Programmausgabe in das Systemprotokoll leiten möchten, was mit dem Befehl logger möglich ist. linux.die.net/man/1/logger
Avery Payne
@AveryPayne Also wie Runtime.exec("logger ...") OK, danke.
Noumenon
0

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. :) :)

Michael Martinez
quelle
Ich werde dies wahrscheinlich irgendwann auf sourceforge verfügbar machen. Die Vorteile sind, dass es sehr klein, leicht, benutzerfreundlich und leistungsoptimiert ist. Sobald der Nachrichtentext gelesen wurde, erfolgt die gesamte Verarbeitung im Speicherpuffer und wird dann direkt an den Socket übertragen.
Michael Martinez
1
xkcd.com/763
user9517
4
Ich versuche nicht , hart zu sein, aber ich bin sein werde stumpf: Diese Lösung nicht existiert , weil es schrecklich. Anstatt mit den anderen Gruppen in Ihrer Organisation zu kommunizieren und eine vernünftige Standardlösung zu implementieren, haben Sie einen Hack mit völlig nicht unterstütztem Code eingerichtet, den Sie jetzt testen / debuggen / warten müssen. Sie haben mehr als 50 Jahre kombinierte Erfahrung ignoriert und Ihnen gesagt: "Tu das nicht" - ich hoffe für dich, dass dies nicht in deinem Gesicht
explodiert
1
Ja. Richtig ... So bewegt sich Open Source vorwärts, Alter. Wenn alle es auf Ihre Weise tun würden, gäbe es keinen Fortschritt. Wie kam es zu GNU, Linux und allem, was darauf basiert? Leute, die genau das tun, was ich hier getan habe. Wenn Sie sich dadurch besser fühlen, beabsichtige ich, meinen Code in unser Paketverwaltungssystem aufzunehmen, in dem jeder hier in der Organisation ihn verwenden, bereitstellen und verbessern kann, wenn er dies wünscht.
Michael Martinez
Und zu Ihrer Information, es ist keine schreckliche Lösung. Im Gegenteil, es ist ein sehr nützliches Werkzeug. Als ich letzte Woche online nach Lösungen suchte, stieß ich auf andere Leute, die fragten, wo sie genau diese Funktionalität finden könnten.
Michael Martinez