Perché abbiamo bisogno di due volte di scrivere gestori in tomcat logging.properties?

Da documenti:

handlers = 1catalina.org.apache.juli.FileHandler, \ 2localhost.org.apache.juli.FileHandler, \ 3manager.org.apache.juli.FileHandler, \ java.util.logging.ConsoleHandler .handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler 

Non ho trovato alcuna spiegazione per cui ho bisogno di gestori di scrittura e dopo .handlers? Esistono regole comuni per file di proprietà simili? Grazie.

La prima riga dichiara l’insieme di gestori che possono / saranno utilizzati, il secondo assegna i gestori allo specifico logger (in questo caso il logger root come .handlers non è prefissato con nulla).

Successivamente in logging.properties ogni gestore è configurato.

Per espandere la risposta di soulcheck , che all’inizio non ho capito …

La riga handlers = ... può essere vista come una “dichiarazione variabile”.

 handlers = 1catalina.org.apache.juli.FileHandler, \ 2localhost.org.apache.juli.FileHandler, \ 3manager.org.apache.juli.FileHandler, \ java.util.logging.ConsoleHandler 

“Dichiaro un logger di nome 1catalina e 1catalina FileHandler , un logger di nome 2localhost e tipo FileHandler .. un logger di tipo ConsoleHandler (non nominando l’ultimo poiché c’è solo uno, quindi nessuna ambiguità).”

D’altra parte, la riga .handlers sarebbe un “compito”.

 .handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler 

“Assegno i gestori 1catalina e console al logger root, il che significa che qualsiasi registrazione eseguita nell’applicazione verrà inoltrata a questi gestori (a meno che non venga eseguito un override)”

Il . in .handlers riferisce a ciò che stai applicando. In questo caso, poiché non c’è nulla a sinistra del . , lo stai applicando al root logger, da cui ereditano tutti i logger.

Ma questo è esattamente lo stesso principio in azione in questa linea:

 com.mycompany.MyClass.handlers = java.util.logging.ConsoleHandler 

In questo caso c’è qualcosa a sinistra del . per i .handlers e questo significa che non assegniamo questi gestori al logger principale ma a un logger specifico. Con questa riga si dice “Sto sovrascrivendo l’assegnazione standard del logger-> per questo specifico logger. In questo caso, non agire come si farebbe in base alla configurazione del root logger. In questo caso, voglio che tu usi solo ConsoleHandler per quel logger “.

Ciò significa che qualsiasi registrazione per MyClass verrà inviata solo a ConsoleHandler e non a nessun altro gestore. Le altre classi non sono interessate da questa linea.

Ancora una volta sto ripetendo la spiegazione di soulcheck, ma in modo più dettagliato, che mi serviva per capire la differenza.