2010-04-27 2 views
10

Abbiamo un'applicazione modulare in cui i moduli hanno i propri log di log4j (cioè log di comunicazione e log degli errori). Gli appendici e le categorie per questi sono tutti configurati nel core log4j XML, ma non tutti i moduli sono sempre installati. Il DailyRollingFileAppender crea il suo file indipendentemente dall'uso e che espone l'intero set di moduli anche se non presenti e poiché alcuni di essi sono specifici del cliente vorremmo nascondere i registri non in uso. C'è un modo per rendere DailyRollingFileAppender creare il suo file al primo utilizzo invece che automaticamente all'avvio?Come posso fare in modo che log4j crei i file di registro solo su richiesta?

+0

Perché non escludere blocchi per componenti disabilitati nel core XML? – newtover

+0

Stiamo implementando la configurazione di log4j e quindi i moduli possono essere aggiunti in seguito. Quando lasciamo aperti i dettagli di log4j per le modifiche locali, abbiamo difficoltà a modificare il file nelle installazioni successive. E sì, abbiamo un requisito di alto livello di automazione dell'installazione. – Mirvnillith

risposta

4

Le appenders di file non hanno alcuna possibilità di creare pigramente i file di log - il metodo setFile crea automaticamente il file se non esiste già: ostream = new FileOutputStream(fileName, append);

dovrete estendere l'appender e sovrascrivere il file di inizializzazione code te stesso per ottenere il comportamento che stai cercando.

+0

Apprezzo che questa risposta sia un po 'in ritardo, ma ho combattuto troppo recentemente con Log4j per lasciare domande sospese :-) – Andy

+0

Dovrò solo mordere quel proiettile quindi ... – Mirvnillith

6

Ho avuto lo stesso problema, quindi ho esteso la classe FileAppender standard e ho creato un nuovo LazyFileAppender che è un FileAppender che inizializza pigramente il file di log (lo crea solo quando avviene la prima operazione di scrittura).

Il LazyFileAppender e alcune altre aggiunte alla libreria standard log4j possono essere trovati in una libreria semplice che ho creato: log4j-additions.

È possibile guardare il sorgente per sviluppare il proprio interno oppure è possibile utilizzare così com'è ...

0

estendere la classe FileAppender standard era successo per me. Così ho trovato un'altra soluzione usando gli appenders in modo programmatico per creare file di log solo su richiesta (e con timestamp nel file del nome). Ho scritto questi due metodi:

public void startLog() { 
    SimpleDateFormat sdf_long = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); 
    FileAppender fa = new FileAppender(); 
    fa.setName("foo"); 
    fa.setFile(sdf_long.format(new Date()) + ".log"); 
    fa.setLayout(new PatternLayout("%d{HH:mm:ss.SSS} %m%n")); 
    fa.setThreshold(Level.DEBUG); 
    fa.setAppend(true); 
    fa.activateOptions(); 
    Logger.getRootLogger().addAppender(fa); 
} 

public void stopLog() { 
    Logger.getRootLogger().getAppender("foo").close(); 
    Logger.getRootLogger().removeAppender("foo"); 
} 

limare le log4j.properties configura solo l'appender console. Quando voglio iniziare la registrazione chiamo il metodo startLog(). Quando voglio accedere a un altro file, chiamo prima stopLog() e poi startLog().