我有一个配置了logback的SpringBoot后端。认证是使用OncePerRequestFilter和在SecurityContextHolder上下文中设置认证来实现的。
我的目标是在logback打印错误时打印loggedUser用户名。我的尝试是添加一个变量(${LOGGED_USER})到logback模式,然后使用下面的代码在OncePerRequestFilter中设置这个变量:
final Context context = (Context) LoggerFactory.getILoggerFactory();
final JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(context);
context.putProperty("LOGGED_USER", username);
try {
configurator.doConfigure(Objects.requireNonNull(getClass().getResource("/logback.xml")));
} catch (JoranException e) {
logger.error("Error while configuring logger", e);
}
这在本地主机环境中工作良好。但是,在生产环境中,当产生错误时,日志记录器会输出多次,显示每个记录的用户名。在我看来,我的代码正在为每个请求创建一个新的日志上下文,并且它们都在同时输出错误。我无计可施,正在寻求帮助!
Thanks in advance
是否尝试使用映射诊断上下文存储用户名?以%X{LOGGED_USER}
的方式访问它final Context context = (Context) LoggerFactory.getILoggerFactory();
final JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(context);
MDC.put("LOGGED_USER", username);
try {
configurator.doConfigure(Objects.requireNonNull(getClass().getResource("/logback.xml")));
} catch (JoranException e) {
logger.error("Error while configuring logger", e);
}
编辑-
由于您使用的是OncePerRequestFilter,因此其他用户的答案可能会对您有所帮助