Voglio configurare un appender all'avvio e poi aggiungerlo e rimuoverlo dinamicamente da vari logger su richiesta. Preferirei che log4j configurasse questo stesso appender e prendessi un riferimento ad esso quando necessario. Se ciò non è possibile, dovrò istanziare l'appatore da solo e tenerlo premuto.Come posso accedere agli appendici Log4J configurati in fase di runtime?
risposta
La classe Logger ha metodi per getAllAppenders(), getAppender(), addAppender(), e removeAppender() metodi, ereditato dalla classe Category. Tuttavia, la classe Category è deprecata e, soprattutto, non ho mai provato a farlo prima, ma questo potrebbe essere un utile punto di partenza.
'Category' è stato soppiantato dalla classe' Logger'. 'Logger' eredita solo da' Category'. Quindi, se il metodo 'Category' non è deprecato, è perfettamente adatto all'uso. –
L'uso di getAppender() o getAllAppenders() non presuppone che l'apper sia già nel Logger? Voglio configurare l'Appender all'avvio, ma non collegarlo ad alcuna categoria all'avvio. Solo al momento del runtime dovrei prenderlo per chiamare addAppender() su un Logger. –
Puoi creare un Appender su richiesta e aggiungerlo. –
Gli allegati sono generalmente aggiunti al logger principale. Ecco alcuni pseudocodice
// get the root logger and remove the appender we want
Logger logger = Logger.getRootLogger();
Appender appender = logger.getAppender("foo");
logger.removeAppender(appender)
// when we want to add it back...
logger.addAppender(appender);
Sono abbastanza sicuro che si può fare questo su altri software rispetto al logger principale e, anche se non ho mai provato.
Giusto, so che posso recuperare un appender da un Logger se è già stato configurato per essere collegato ad esso. Tuttavia, sto cercando un modo per catturare un appender configurato all'avvio che sia * NON * già collegato a un logger. –
Voglio fare esattamente la stessa cosa. Voglio configurare gli appendici in log4j.properties e selezionarne alcuni e aggiungerli dinamicamente al rootLogger in fase di runtime.
io non riuscivo a capire come accedere alle appenders diverse tramite un registratore a cui erano stati attaccati, così ho finito per creare una fittizio logger, e allegando le appenders ad esso così ho potuto recuperarli in modo dinamico. Questo non è l'ideale, poiché tutte le risorse utilizzate dagli appendici (ad esempio i file) vengono create in anticipo anche se non vengono utilizzate.
Penso che questa sia davvero l'unica soluzione. Il registro dell'appender è privato in [PropertyConfigurator] (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html) o [DOMConfigurator] (http://logging.apache.org /log4j/1.2/apidocs/org/apache/log4j/xml/DOMConfigurator.html). PropertyConfigurator cancella anche il suo registro una volta terminato. – James
vorrei fare in questo modo:
- hai Appender specificato nella log4j.properties, ma non aggiunto al logger principale.
- in fase di esecuzione, quando necessario, afferrare log4j.properties, estrarre da esso le proprietà necessarie, creare un'istanza dell'appender e impostarne le opzioni leggendo le proprietà estratte.
- attiva l'appatore
- Logger.getRootLogger(). AddAppender (appender);
- calci fuori quando hai finito di usarlo -. Logger.getRootLogger() removeAppender (..)
Ora, se questo è il tuo appender, facendo (2) sarebbe facile in quanto si conosce il significato di le proprietà e sapere cosa aspettarsi. Altrimenti probabilmente vorrai usare il reflection per istanziare la classe e chiamare i suoi setter di proprietà prima di fare (3).
Se si abilita/disabilita Appenders in fase di esecuzione che si desidera fare, ho trovato un'altra soluzione (sebbene non molto elegante). Usando la configurazione di log4j aggiungi tutti gli Appenders di cui avresti bisogno come fai normalmente.
In fase di esecuzione quando si desidera "disabilitare" un appender, aggiungere un filtro (org.apache.log4j.spi) che restituisce Filter.DENY per ogni messaggio di registro. In questo modo nessun messaggio supera questo Appender. Quando vuoi "abilitare" l'Appender, basta semplicemente cancellare il filtro che hai aggiunto sopra.
Ho provato questo e funziona bene per noi (log4j 1.2).
Voglio fare esattamente la stessa cosa. Voglio configurare gli appendici in log4j.properties e selezionarne alcuni e aggiungerli dinamicamente al rootLogger in fase di runtime. – Joel