Frage

Ich mag einen Appender (oder so ähnlich), die Ereignisse bauen und unter bestimmten Bedingungen kontrolliert erstellten Protokolle neue Ereignisse.

Ein Beispiel wäre und Escalating Appender, die geloggt, wenn eine bestimmte Menge von identischen Ereignissen überprüft und wenn ja, protokolliert das Ereignis mit einem höheren logleve. So könnte man so etwas wie definieren. Wenn Sie auf diesem Logger mehr als 10 identische Warnungen erhalten, macht es zu einem Fehler

Also meine Fragen sind:

  1. Ist so etwas wie dies bereits vorhanden ist?

  2. Ist ein Appender die richtige Klasse, dieses Verhalten zu implementieren?

  3. Gibt es irgendwelche Fallen Sie könnten denken, ich achten sollte?

Zur Verdeutlichung: Ich bin gut mit dem Algorithmus des Sammelns und die Ereignisse zu analysieren. Ich werde das in der Appen mit einer Sammlung tun. Persistence ist nicht notwendig, für meine Zwecke. Meine Frage # 2: ist ein appender der richtige Ort für dies zu tun? Schließlich ist es nicht normales Verhalten Logging Einträge für eine appender creat.

War es hilfreich?

Lösung

Logback (log4j Nachfolger) ermöglicht es Ihnen, die Protokollierung für jede Veranstaltung über TurboFilters . Zum Beispiel tritt N das gleiche Ereignis unter der Annahme oder mehrmals in einem bestimmten Zeitraum, können Sie das Ereignis erzwingen (unabhängig von ihrer Ebene) akzeptiert werden. Siehe auch DuplicateMessageFilter , die nicht die inverse (wiederkehrende Ereignisse zu leugnen).

Aber auch logback wird der Pegel des Protokolliervorgangs nicht zulassen, werden erhöht. Log4j wird entweder nicht. Weder Rahmen ist dafür ausgelegt, und ich würde Sie davon abhalten, versucht, die Ebene on the fly und im selben Thread zu erhöhen. Auf der anderen Seite, das Niveau bei der Nachbearbeitung Inkrementieren ist eine ganz andere Sache. a neue Protokolliervorgangs mit einer höheren Ebene zu erzeugen, einen weiteren Thread Signalisierung ist eine zusätzliche Möglichkeit. (Haben Sie Ihre Turbo-Filter einen weiteren Thread Signal zu erzeugen, eine neue Protokolliervorgangs mit einem höheren Niveau.)

Es war aus Ihrer Frage nicht klar, warum Sie das Niveau gewünscht erhöht werden. War der Zuwachs der Ebene ein Grund, an sich oder war es ein Mittel, um ein Ziel, dass das Ereignis mit unabhängig von ihrer Ebene protokolliert. Wenn letzteres, dann logback den TurboFilters ist der Weg zu gehen.

HTH,

Andere Tipps

Sie können Ihre eigenen appender durch die Implementierung der Schnittstelle Appender von log4j bereitgestellt erstellen.

http://logging.apache.org /log4j/1.2/apidocs/org/apache/log4j/Appender.html

Das wäre ein Ansatz. Eine andere Möglichkeit wäre, eine bestehende appender zu verwenden und dann einen Code schreiben, der das Protokoll überwacht. Zum Beispiel könnten Sie in die Datenbank einloggen und dann einen Prozess schreiben, die die Log-Einträge in der Datenbank überwacht und erstellt Meta-Ereignisse auf, was es sieht.

Es hängt am meisten auf, was Sie bequem mit. Eine Frage, werden Sie zu tun haben ist, wie im Protokoll zurückblicken Ihre Meta-Events zu erstellen. Entweder Sie haben Ereignisse in Ihrem appender sammeln oder sie irgendwo anhalten, dass Sie abfragen können Sie Ihre Meta-Ereignisse zu konstruieren. Das Problem mit ihnen akkumulieren ist, dass, wenn Sie Ihren Prozess stoppen und starten, werden Sie entweder sie irgendwo abzuladen, so dass sie nach oben oder von vorne beginnen, wenn der Prozess neu gestartet werden gepflückt zurück.

Zum Beispiel, sagen wir mal, dass ich jedes 10. Mal einen Protokolleintrag erstellen möchten ein NullPointerException geworfen wird. Wenn ich die Log-Einträge in einer Datenbank irgendeiner Art haben, führen Sie jedes Mal, wenn ein NPE geworfen ich eine Abfrage, um zu sehen, wie viele NPE seit dem letzten Mal geworfen ich für sie einen Protokolleintrag erstellt. Wenn ich sie nur im Speicher zählen ein jedes Mal ausgelöst wird, wenn ich die Anwendung nach 5 geworfen neu zu starten, wenn ich zähle ich verlieren werde nicht über diese Zahl bestehen bleiben.

Als Rafe bereits erwähnt, wäre die größte Herausforderung darin, die tatsächlichen Ereignisse in den Appender persistierenden werden, so dass Sie die Zeit gekommen ist, wissen werden Ihr Ereignis auslösen (z Protokollebene eskalieren).

Deshalb schlage ich vor, eine folgende Strategie:

  1. Verwenden Sie einen individuelle JDBCAppender . Im Gegensatz zu dem mit Log4j gebündelt, kann dies ein Ausnahme anmelden.
  2. Set-up eine eingebettete Datenbank, wie HSQLDB und eine Datenbank mit einer Tabelle für die Ereignisprotokollierung Set-up . Sie löst das Problem Ausdauer, wie Sie SQL verwenden können Arten von Ereignissen zu finden, die aufgetreten sind.
  3. Ausführen einen separaten Thread, der die Datenbank überwacht, und die gewünschte Ereignis Muster erkennt.
  4. Verwenden Sie einen LogManager Zugang gewünschte Logger s und legen ihre Ebene manuell .
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top