Вы хотите посмотреть Вложенные диагностические контексты или Сопоставленные диагностические контексты в log4j или slf4j.NDC / MDC позволяет вставлять в сеанс данные, которые можно фильтровать с помощью log4j.
Таким образом, вы определяете имя пользователя в NDC, а затем можете изменить свойства log4j.properties, чтобы изменить ведение журнала.уровень для определенных пользователей.
MDC использует карту, тогда как NDC основан на принципе стека.Если вы используете slf4j , вы даже можете создавать отдельные файлы журналов в зависимости от информации в вашем MDC.
Например, мы делали это, когда пользователи заходили на веб-сайт.Мы хотели отследить, что делал конкретный пользователь (ретроспективно), поэтому мы добавили имя пользователя и идентификатор сеанса в NDC, а затем мы можем опубликовать фильтр по ним.
Код был похож на следующее:
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
MDC.put("username", session.getParameter("username")); // or where ever t is stored
chain.doFilter(request, response);
}
}
В вашем файле log4j.xml этот фильтр основан на пользователе:
<appender name="UserDebug" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="userdebug.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="5000KB"/>
<param name="maxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] user:%X{username} %-5p - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="user:fred" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>
% X {ключ} выводит значение MDC.get (ключ) в MDC.Если вам нужен более сложный фильтр, вы можете расширить его самостоятельно и посмотреть значения в MDC самостоятельно.