Java 使用Spring Security时,Tomcat访问日志中缺少用户(%u)

Java 使用Spring Security时,Tomcat访问日志中缺少用户(%u),java,authentication,tomcat,spring-security,access-log,Java,Authentication,Tomcat,Spring Security,Access Log,我在ApacheTomcat8中运行了一个示例SpringSecurity(HelloWorld)web应用程序。我试图看到的是Tomcat访问日志中的用户信息,但看起来这些信息并不存在。访问日志条目的示例: 0:0:0:0:0:0:0:1 - - [06/Nov/2019:09:41:57 +0200] "GET / HTTP/1.1" 200 422 0:0:0:0:0:0:0:1 - - [06/Nov/2019:09:41:59 +0200] "GET /hello HTTP/1.1"

我在ApacheTomcat8中运行了一个示例SpringSecurity(HelloWorld)web应用程序。我试图看到的是Tomcat访问日志中的用户信息,但看起来这些信息并不存在。访问日志条目的示例:

0:0:0:0:0:0:0:1 - - [06/Nov/2019:09:41:57 +0200] "GET / HTTP/1.1" 200 422
0:0:0:0:0:0:0:1 - - [06/Nov/2019:09:41:59 +0200] "GET /hello HTTP/1.1" 200 83
Tomcat
server.xml
中的访问日志配置为:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="common" />

pattern=“common”
与“%h%l%u%t”%r“%s%b”所定义的通用日志格式相对应。Tomcat文档还说明:

%u-已通过身份验证的远程用户(如果有),否则“-”

我是否应该应用任何其他配置,以使用户在访问日志中可见?

因为,它可能无法按预期工作

Tomcat的访问日志阀不起作用,因为Tomcat不知道Spring安全性,它完全在您的应用程序中运行

您可以使用过滤器:

最简单的选择是在Spring Security之后添加您自己的过滤器(例如在web.xml中),并转储您想要的信息

在其他解决方案中,您可能需要将用户名包含为会话属性

这可能是不够的,因为公共模式已包含%u参数。在这种情况下,我建议另外两个步骤:

1) 将用户名放入请求会话参数中,类似于:

request.getSession().addAttribute("username", user.getName());
2) 在访问日志模式中添加以下参数:%%{username}s

server.tomcat.accesslog.pattern=%h %l %t %u %{username}s "%r" %s %b

您是否有一些示例来说明此筛选器如何显示给用户?@StiliyanVasilev请参阅我已经实现了自定义筛选器,并尝试通过%{username}在访问日志中打印它,并且它工作正常。我还尝试通过%reqAttribute{username}打印带有LogbackValve的日志,但它返回“-”。您知道如何在LogbackValve场景中获取用户名吗?@StiliyanVasilev我目前不知道know@StiliyanVasilev我想您可以问一个关于使用带有session属性的LogbackValve进行日志记录的新问题