2012-05-10 1 views
5

Die Java-Protokollierungskonfigurationsdatei ermöglicht es mir, die Eigenschaften eines benannten Protokollierers zu definieren, z.So konfigurieren Sie die Eigenschaften eines bestimmten FileHandlers

name.heikoseeberger.heikotron.level = FINE 
name.heikoseeberger.heikotron.handlers = java.util.logging.FileHandler 

So weit, so gut. Nun möchte ich konfigurieren , dass insbesondereFileHandler, z. mit einer bestimmten Ausgabedatei. Leider weiß ich nur, wie der „globale“ Filehandler, konfigurieren, die bereits in der Konfigurationsdatei ist:

java.util.logging.FileHandler.pattern = %h/java%u.log 
java.util.logging.FileHandler.limit = 50000 
java.util.logging.FileHandler.count = 1 
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter 

Ich will nicht, diese konfigurieren, aber die Instanz, die mit meinem benutzerdefinierten verbunden ist Logger. Ich habe bereits versucht, die folgenden, aber ohne Erfolg:

name.heikoseeberger.heikotron.java.util.logging.FileHandler.pattern = %h/heikotron.log 
name.heikoseeberger.heikotron.java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter 

Ist es überhaupt möglich, die Eigenschaften bestimmter Filehandler Instanzen zu setzen? Wenn ja, wie sollen diese identifiziert/benannt werden?

Antwort

0

Ich glaube nicht, dass es möglich ist. Wenn Sie den Quellcode für die FileHandler überprüfen bestimmen Sie werden bald, dass es die Zeichenfolge "java.util.logging.FileHandler.pattern "verwendet das Muster der Datei zu bestimmen zur Protokollierung

private void configure() { 
     LogManager manager = LogManager.getLogManager(); 

     String cname = getClass().getName(); 

     pattern = manager.getStringProperty(cname + ".pattern", "%h/java%u.log"); 
     limit = manager.getIntProperty(cname + ".limit", 0); 
     //... 
    } 

Als solche zu verwenden, die Konfiguration, die Sie in die setzen Datei wird nicht einmal berücksichtigt der Handler genommen worden.

Es scheint mir, dass Handler sind keine Kenntnis von der Existenz eines bestimmten Logger (dh name.heikoseeberger.heikotro n), sie wissen, wie eine gegebene LogRecord zu veröffentlichen.

Soweit ich sehen kann, die Handler eines Teils icular Logger vom LogManager erstellt werden, durch reflektiv ihre Standardkonstruktors Aufruf, als solche, wenn ein gegebener Handler erstellt wird, ist es nicht bewusst, für die besonderen Logger es angefordert wurde, ist, warum alle ihre Eigenschaften durch ihre eigenen gesetzt Klassennamen und nicht über den Namen des Loggers.

0

Wenn ich richtig verstehe, versuchen Sie, in verschiedenen Protokolldateien mit java.util.logging Paket zu schreiben. Dies kann nicht out of the box getan werden, ohne es zu erweitern.

Wenn Sie nicht zu einem anderen Logging-Framework wie Logback wechseln können, überprüfen Sie die Antwort auf java util logging.properties: How to log to two different files und sehen Sie, ob es Ihren Bedürfnissen entspricht.

1

Dies wird mit der Option configOption durchgeführt, die in der Top-Level-Klassendokumentation des LogManger beschrieben ist. Erstellen Sie eine öffentliche benannte Klasse mit einem öffentlichen Konstruktor und rufen Sie alle Java-Aufrufe auf, die Sie zum Konfigurieren Ihres Handlers ausführen müssen. Dann leiten Sie in Ihren Logging-Eigenschaften den LogManager an, um die von Ihnen erstellte Klasse zu laden, um Ihren Handler zu konfigurieren. Andernfalls können Sie den Dateihandler ableiten, der einen benutzerdefinierten Namespace zum Konfigurieren erstellt.

+0

‚Eine Eigenschaft "config". Diese Eigenschaft ermöglicht die Ausführung von beliebigem Konfigurationscode. ' So könnte dies verwendet werden, um eine andere Konfigurationsdatei mit Klasse zu Dateinamenzuordnungen zu laden –