2015-10-19 76 views
2

在生产环境中,我只记录WARN和ERROR日志消息。Log4j为生产中的特定用户记录自定义级别

我需要实现一种机制,记录(a)特定用户的所有日志级别。

我正在处理来自外部的请求(不一定是servlet),从一开始我就可以检索用户名,所以我可以将用户名放在MDC中,并且它会转到日志消息。

但是,我需要检查用户名是否在预定义的用户列表中(此列表实际上可以在运行时动态更新),如果用户名称在此列表中,那么我需要启用(仅限此用户)记录来自fx。 TRACE级别(意味着所有TRACE,DEBUG,INFO,WARN和ERROR)。

这可能吗?

更新#1:我们正在使用Spring启动的Log4j

更新#2:Log4j的配置

LOG_PATTERN=%d{yyyy-MM-dd HH:mm:ss.SSS} %X{context} ${PID} %5p %-10X{username} [%t] - %c{1}(%L): %m%n 

log4j.rootCategory=INFO, amqp 

log4j.category.org.springframework=WARN 
log4j.category.com.acme=DEBUG 

log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=logs/app.log 
log4j.appender.file.MaxFileSize=100MB 
log4j.appender.file.MaxBackupIndex=10 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=${LOG_PATTERN} 

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=${LOG_PATTERN} 

log4j.appender.amqp=org.springframework.amqp.rabbit.log4j.AmqpAppender 
log4j.appender.amqp.host=localhost 
log4j.appender.amqp.port=5671 
log4j.appender.amqp.username=username 
log4j.appender.amqp.password=password 
log4j.appender.amqp.virtualHost=vhost 

log4j.appender.amqp.exchangeName=logging.pub 
log4j.appender.amqp.exchangeType=topic 
log4j.appender.amqp.routingKeyPattern=%c.%p 
log4j.appender.amqp.declareExchange=false 
log4j.appender.amqp.durable=true 
log4j.appender.amqp.autoDelete=false 
log4j.appender.amqp.contentType=text/plain 
log4j.appender.amqp.generateId=false 
log4j.appender.amqp.senderPoolSize=2 
log4j.appender.amqp.maxSenderRetries=30 
log4j.appender.amqp.layout=org.apache.log4j.PatternLayout 
log4j.appender.amqp.layout.ConversionPattern=${LOG_PATTERN} 
+2

SLF4J只是外墙。什么是您的日志记录实施/桥梁在使用中? Commons Logging? Log4j的?的logback?我想你应该能够为此至少在logback和log4j中定义一些过滤器。 – Fildor

+0

对不起....我们正在使用Spring Boot Log4j(我也更新了这个问题) – KimHansen

+0

用户特定的完整日志是否会分离appender?像每个用户进入不同的文件或类似的东西?我们可以看到您当前的日志配置吗? – Fildor

回答

0

所有的澄清之后,简单的答案是:没有。

由log4j的trace/debug/.../error方法完成的第一个检查是记录器级别。如果日志事件级别低于日志记录器配置的级别 - 没有其他操作完成,则日志记录方法返回。消息格式化,处理诊断上下文,触发appender - 只要有任何要处理的内容,都会在稍后进行。在log4j 1中,它不能通过配置进行更改。

在log4j 2中我们有全局过滤器,它们在记录器级别测试之前被检查 - 虽然我不知道它们是否适合这种任务,但我肯定会开始在那里寻找。如果您可以升级到log4j 2,请检查它们。