2010-10-06 17 views
5

Ho un'applicazione Web e voglio utilizzare un registro diverso per ogni utente, così posso avere una "cronologia" di ciò che l'utente ha fatto sul sistema.Un log diverso per ogni utente che utilizza Log4j

Questo è quello che ho finora:

import java.io.File; 
import java.io.IOException; 

import org.apache.log4j.DailyRollingFileAppender; 
import org.apache.log4j.FileAppender; 
import org.apache.log4j.SimpleLayout; 
import org.apache.log4j.Logger; 

public class LogManager { 

    public Logger getLog(String username) throws IOException{ 
     SimpleLayout layout = new SimpleLayout(); 
     FileAppender appender = new DailyRollingFileAppender(layout, "users"+File.pathSeparator+username+File.pathSeparator+username, "'.'yyyy-MM"); 

     // configure the appender here, with file location, etc 
     appender.activateOptions(); 
     Logger logger = Logger.getRootLogger(); 
     logger.addAppender(appender); 
     return logger; 
    } 

} 

Il problema è che, come un'applicazione web, è multithreaded, quindi per quanto ne so non posso usare RootLogger tutto il tempo e cambiare le appenders a seconda dell'utente chi sto registrando Penso che dovrei creare diversi Logger per ciascun utente, ma è corretto?

+0

quanti utenti potresti avere? – dogbane

+0

tra 1.000 e 10.000 – pakore

+0

Sei consapevole del fatto che molto probabilmente non ti sarà permesso di aprire 10.000 file contemporaneamente nel modulo di log del tuo server web? –

risposta

4

provare a passare a logback (successore di log4j). Viene fornito con un SiftingAppender che può essere utilizzato per separare (o setacciare) la registrazione in base a un determinato attributo di runtime, che sarebbe "userid" nel tuo caso. documentation contiene un esempio per la separazione dei registri in base a userid.

+0

Questo era esattamente quello che stavo cercando. Grazie! – pakore

2

Suggerirei di utilizzare le informazioni di contesto del registro per registrare l'utente per qualsiasi azione particolare e includerlo nei record del registro.

Quindi, ogni volta che è necessario il registro per un particolare utente, scorrere il file di registro singolo. Se hai bisogno di dividere tutti i file, fallo quando il registro ruota. Questa post-elaborazione sarà molto più semplice che mantenere un file aperto per ogni utente contemporaneamente.

+0

Anche questo è un buon approccio e mi piace l'idea della post-elaborazione. +1 per questo. Se potessi accettare anche la tua risposta, lo farei! – pakore

Problemi correlati