2016-01-28 8 views
6

Ich schreibe eine benutzerdefinierte Protokollkonfigurationsklasse, die einen bestimmten Handler einrichtet und ihn dem Stammlogger zuordnet und plant, ihn in mehreren Anwendungen zu verwenden. Ich bin besorgt, dass der tatsächliche Programmcode diesen Handler entfernt und einen anderen installiert.Kann ein Handler erkennen, dass er entfernt wurde?

Gibt es eine Möglichkeit, dass ein Handler erkennen kann, dass er von einem bestimmten Logger entfernt wurde oder dass ein Logger meldet, dass die Associates geändert wurden?

Meine einzige andere Alternative ist es, einen Thread zu haben, die regelmäßig die Root-Logger-Handler abfragt und diese Prozedur wieder, die extrem hässlich ist

Antwort

0

Sie eine benutzerdefinierte schaffen könnte Logger die removeHandler() überschreibt jede spezielle Verarbeitung zu tun, dass Sie brauchen, und melden Sie sich anstelle des Root-Loggers an.

+0

Leider habe ich keine Kontrolle über die Logger - nur von den Handlern, die erstellt werden können und der Logging-Konfigurationsdatei :( – Uri

2

Gibt es eine Möglichkeit, dass ein Handler erkennen kann, dass er von einem bestimmten Logger entfernt wurde oder dass ein Logger meldet, dass die Associates geändert wurden?

Um Unterklassen von Logger zu erzeugen, müssen Sie einen benutzerdefinierten LogManager erstellen. In einigen Umgebungen erwarten Sie einen bestimmten Protokollmanager, der möglicherweise nicht funktioniert.

Allerdings gibt es ein paar hacky Dinge, die Sie ausprobieren können.

  1. Das Ändern der Loggerhandler erfordert Protokollierberechtigung. Wird unter einem SecurityManager ausgeführt, der den Zugriff anderer Threads verhindert oder einen benutzerdefinierten SecurityManager erstellt, der einen Rückruf auslöst, wenn die Protokollierungssteuerung angefordert wird.

  2. Wenn Sie diese Vergangenheit zu sein bekommen können sehr spezifische Umsetzung und zerbrechlich Sie die Tatsache nutzen, dass Logger.removeHandler Handler.equals(Object) beim Aufruf beruht. Überschreiben Sie den Wert in Ihrer benutzerdefinierten Handlerimplementierung und verwenden Sie Throwable.getStackTrace(), um die Frames zu untersuchen, um zu prüfen, ob equals von removeHandler aufgerufen wurde. Wenn es dann einfach falsch zurückgegeben wurde.

Meine einzige andere Alternative ist es, einen Thread zu haben, die regelmäßig die Root-Logger-Handler abfragt und diese Prozedur wieder, die extrem hässlich ist für extrem hässlich

sich bereit.

+0

Diese Antwort ließ mich zittern. –

+0

@ IngoBürk Hinzugefügt Warnungen, um die feine Hackerei im Spiel zu zeigen zu bedenken ist, gibt es keine saubere Lösung für die OPs Frage. Denken Sie an diese Antwort als zeigen, wie Wurst in java.util.logging gemacht wird. – jmehrens

+0

Fair genug, ich werde meine Downvote entfernen. –

Verwandte Themen