Um log diferente para cada usuário usando Log4j

Eu tenho um webapplication e eu quero usar um log diferente para cada usuário, para que eu possa ter um “histórico” do que o usuário fez no sistema.

Isto é o que eu tenho até agora:

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

O problema é que, como um webapplication, é multithreaded, então AFAIK eu não posso usar RootLogger o tempo todo e mudar os appenders dependendo do usuário que eu estou registrando. Eu acho que devo criar o Logger diferente para cada usuário, mas isso está correto?

Tente mudar para o logback (sucessor do log4j). Ele vem com um SiftingAppender que pode ser usado para separar (ou peneirar) o registro de acordo com um determinado atributo de tempo de execução, que seria “userid” no seu caso. A documentação contém um exemplo para separar logs com base no ID do usuário.

Sugiro usar uma informação de contexto de log para registrar o usuário para qualquer ação específica e include isso em seus registros de log.

Então, sempre que você precisar do log de um usuário específico, vasculhe o arquivo de log único. Se você precisar de todos os arquivos divididos, faça isso quando o log for rotacionado. Esse pós-processamento será muito mais simples do que manter um arquivo aberto para todos os usuários simultaneamente.

O “Contexto de Diagnóstico Aninhado” é destinado a esse caso de uso – você pode carimbar cada instrução de log com um ID para identificar o usuário (como um endereço IP, nome de usuário, etc)

mais aqui: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/NDC.html

(edit: aqui outro post útil no NDC: Quando usar ‘contexto de diagnóstico nested’ (NDC)? )