2009-06-20 14 views
5

Wir möchten über alle wichtigen Ereignisse in unseren Systemen Aufzeichnungen führen. Wenn beispielsweise in der Datenbank der aktuelle Benutzerstatus gespeichert wird, sollten im Ereignisprotokoll alle Änderungen dieses Status sowie die Zeitpunkte der Änderungen aufgezeichnet werden. Die Event-Logging-Funktion sollte für den Event-Werfer so nah wie möglich an Null sein, sollte strukturierten Informationen (im Gegensatz zu Textprotokoll-Nachrichten) Rechnung tragen und verteilte Deployment unterstützen (viele Felder werfen viele Ereignisse).Minimale Aufwand verteilte Event Logging-Bibliothek/Framework?

In einem früheren Leben hatten wir ein UDP-basiertes System, das gut funktionierte, weil wir eine große Kontrolle über das System hatten (minimierter Paketverlust). Die geraden Werfer würden UDP-Pakete abfeuern, die auf anderen Boxen aufgefangen und aufgezeichnet würden. Ich suche nach etwas ähnlichem, hoffentlich Open Source, von der Stange, und in allgemeineren Netzwerken einsetzbar. Alternativ bin ich offen für Vorschläge, wie man so etwas baut.

Dies sollte in mehreren Sprachen funktionieren, wird aber in erster Linie für Java und Python bestimmt sein. Die paritisierenden (Event-Throwing-) Anwendungen werden variieren; Einige werden Web-Apps sein, andere Batch-orientierte Apps. Die Ergebnisse werden wahrscheinlich in Hadoop/HDFS/HBase vorliegen.

+0

Überprüfen Sie dies: http://logstash.net/docs/1.3.3/tutorials/getting-start-centralized – hB0

Antwort

3

Wenn Sie die UDP-Route (wie Sie scheinen glücklich damit) gehen, und Java ist eine Option, dann überprüfen Sie Log4j und seine Unterstützung für UDP-Übertragung über die Log4j UDPAppender.

LoggingEvent nimmt ein java.lang.Object als eine Nachricht, also ist es ziemlich allgemein und Sie können alle gewünschten Daten hineinwerfen. Wenn Sie über das Netzwerk gehen, sollte es (wahrscheinlich) serialisierbar sein, und angesichts der Tatsache, dass Sie UDP wollen, sollte es eine passende Größe haben - 64k oder weniger und dann abhängig von der Transportschicht. Sie müssen das LoggingEvent nur auf der Serverseite abfangen und dann wie gewünscht weiterverarbeiten.

Beachten Sie, dass der UDP Appender als Companion Komponente zu Log4j kommt und Sie es selbst erstellen müssen. Aber das ist trivial.

+0

Guter Punkt, aktualisierte Frage mit Sprache und Infrastruktur info. Unterstützt Log4J strukturierte Daten? Ich habe es nur mit einfachen Textnachrichten verwendet, aber ich nehme an, wir könnten JSON hineinwerfen und fertig sein. – Parand

+0

Die LoggingEvent-Klassennachricht ist ein java.lang.Object, also ziemlich allgemein. Das LoggingEvent-Objekt wird herumgesendet (und in einigen Fällen serialisiert, so dass Ihre Nachricht serialisierbar sein muss), und dann müssen Sie es am UDP-Empfänger abfangen. Aber das ist keine große Sache. Es würde wahrscheinlich ein wenig Experimentieren rechtfertigen. –

+0

Bearbeitet, um das oben in der Antwort widerzuspiegeln –

0

Es klingt wie ein potenzieller Kandidat für Messaging (Feuer und vergessen). Ich bin meistens eine .NET-Person, weiß also nicht, welche Logger-Frameworks es für Java gibt. Aber ich habe kurz nachgesehen, ob es Logging-Appender für log4j gibt (ich benutze log4net ziemlich oft) - IBM hat einen Artikel über a WebSphere MQ JMS appender, der für Sie hilfreich sein könnte.

Also anstatt meine Antwort wie befürworten die Verwendung von WebSphere MQ-bitte nehmen Sie als einen Vorschlag, um Messaging zu berücksichtigen - es gibt viele Open-Source-Messaging-Frameworks da draußen - RabbitMQ ist nur ein Beispiel.

+0

Danke Richard, MQ-Systeme könnten ein Weg sein zu gehen. Ich würde gerne die Worst-Case-Benchmarks für die Zeit sehen, die zum Senden von Nachrichten benötigt wird, da es wichtig ist, dass das Protokollierungssystem den Werfer so wenig wie möglich beeinflusst. Ich hatte angenommen, dass MQ-Systeme zu schwer wären, aber das könnte eine ungültige Annahme sein. – Parand

+0

Klingt, als ob Sie ein Benchmarking in Erwägung ziehen sollten. Sie sollten auch andere Messwerte berücksichtigen, z. B. wie wichtig die garantierte Zustellung ist, ob die Komponenten in einer gelegentlich diskontierten Umgebung usw. ausgeführt werden. – RichardOD

2

Sie können alte gute * nix Syslog verwenden. Es hat einen sehr geringen Overhead und wird meistens über UDP oder lokale UNIX-Sockets verwendet, kann aber TCP verwenden, wenn Sie eine zuverlässige Protokollierung benötigen. Works for my (Python/Perl, meistens, aber es ist komplett Sprache/Plattform-agnostic) wie ein Charme.

Sorry, bin ich mit Java nicht vertraut, aber Feature-weise, dies scheint einige gute Bibliothek zu sein, ich habe googed: http://syslog4j.org/

bearbeiten: Schnell einen Artikel namens „Robust event logging with Syslog“ entdeckt googeln, das scheint ziemlich detailliert zu sein. Entschuldigung, ich habe es bei der Veröffentlichung falsch gelesen und dachte, es sei eine * nix syslog-Bibliothek, aber das ist es nicht.