2010-10-06 26 views
5

Tengo una aplicación web y quiero utilizar un registro diferente para cada usuario, por lo que puedo tener un "historial" de lo que el usuario hizo en el sistema.Un registro diferente para cada usuario que usa Log4j

Esto es lo que tengo hasta ahora:

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; 
    } 

} 

El problema es que, como una aplicación web, es multiproceso, por lo que yo sepa que no puedo usar RootLogger todo el tiempo y cambiar los appenders dependiendo del usuario a quién estoy registrando Creo que debería crear diferentes Logger para cada usuario, pero ¿es eso correcto?

+0

¿cuántos usuarios podría tener? – dogbane

+0

entre 1,000 y 10,000 – pakore

+0

¿Sabía que lo más probable es que no se le permita abrir 10.000 archivos simultáneamente en su módulo de registro del servidor web? –

Respuesta

4

Intente cambiar a logback (sucesor de log4j). Viene con un SiftingAppender que se puede usar para separar (o cernir) el registro de acuerdo con un atributo de tiempo de ejecución dado, que sería "userid" en su caso. El documentation contiene un ejemplo para separar registros basados ​​en ID de usuario.

+0

Esto es exactamente lo que estaba buscando. ¡Gracias! – pakore

2

Sugeriría utilizar una información de contexto de registro para registrar al usuario para cualquier acción en particular, e incluir eso en sus registros.

Luego, cuando necesite el registro para un usuario en particular, rastree el único archivo de registro. Si necesita dividir todos los archivos, hágalo cuando el registro gire. Este postproceso será mucho más simple que mantener un archivo abierto para cada usuario al mismo tiempo.

+0

Este es un buen enfoque también y me gusta la idea del post-procesamiento. +1 por eso. ¡Si pudiera aceptar tu respuesta también, lo haría! – pakore

Cuestiones relacionadas