在Spring应用程序中在容器启动时记录宁静的端点

Alb*_*tin 4 java rest spring spring-mvc restful-url

我有一个Spring应用程序,它通过Controller类中的@RequestMapping注释公开了宁静的端点。

我希望在服务器启动时,将所有应用程序控制器的所有端点都登录到控制台。

我使用tomcat服务器和log4j进行日志记录。

谢谢。

Nao*_*Bar 9

For those who use spring-boot:

In the latest spring-boot release (since v2.1), they changed the mapping default log level (as specified in the Release Notes here).

Add one of the following properties to application.properties file:

  • logging.level.web=TRACE
  • logging.level.org.springframework.web=TRACE

Sample Console Output:

2018-12-12 11:16:51.793 TRACE 11868 --- [  restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping
    c.n.c.MyController:
    {POST /users}: addUser(User)
    {DELETE /users}: deleteUser(User)
    {PUT /users}: updateUser(User)
    {GET /users/{id}}: getUserById(String)
    {GET /users}: getUsers()
    {GET /users_static}: getUsersStaticList()
2018-12-12 11:16:51.795 TRACE 11868 --- [  restartedMain] s.w.s.m.m.a.RequestMappingHandlerMapping
    o.s.b.a.w.s.e.BasicErrorController:
    { /error}: error(HttpServletRequest)
    { /error, produces [text/html]}: errorHtml(HttpServletRequest,HttpServletResponse)
Run Code Online (Sandbox Code Playgroud)


leo*_*kom 6

从 Spring 5.3.5 开始,可以使用特殊的专用隐藏记录器来记录端点映射,而无需记录所有请求处理的开销。

<Logger name="_org.springframework.web.servlet.HandlerMapping.Mappings" level="debug" additivity = "false">
Run Code Online (Sandbox Code Playgroud)

此功能在https://github.com/spring-projects/spring-framework/issues/26539中引入


dav*_*xxx 5

在log4J中,添加类的信息日志级别 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

随着级别INFO

log4j.category.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=INFO
Run Code Online (Sandbox Code Playgroud)

您应该具有此类信息(行被截断了):

2016-11-15 23:34:30.040  INFO 10156 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/api/contacts/{id}],methods=[GET],produces=[application/json]}" o
2016-11-15 23:34:30.040  INFO 10156 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/api/contacts/{id}],methods=[DELETE],produces=[application/json]}
2016-11-15 23:34:30.040  INFO 10156 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/api/contacts],methods=[POST],consumes=[application/json],produce
2016-11-15 23:34:30.040  INFO 10156 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/api/contacts/{id}],methods=[PUT],consumes=[application/json],pro
2016-11-15 23:34:30.040  INFO 10156 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/api/contacts],methods=[GET],produces=[application/json]}" onto p
2016-11-15 23:34:30.040  INFO 10156 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/api/contacts/search],methods=[GET],params=[group-id],produces=[a
Run Code Online (Sandbox Code Playgroud)

更新

从Spring MVC 5.1 / Spring Boot 2开始,日志记录策略已更改。
现在INFO,该DEBUG级别记录的信息很少,该级别提供了更多信息,但没有详细说明。
只有TRACE关卡会提供详细信息。

这是变更日志(重点是我的):

记录版本:

通过标准的Commons Logging可以检测到Spring的JCL桥。

信息,可读的调试日志,跟踪级别的详细信息上的噪音更少

因此,以这种方式更改日志记录配置以列出所有映射:

Log4J属性方式:

log4j.category.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=TRACE
Run Code Online (Sandbox Code Playgroud)

登陆方式:

<logger level="TRACE" name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
Run Code Online (Sandbox Code Playgroud)


dim*_*sli 5

要添加到先前的答案中,Spring Boot有一个Actuator,它公开了一个名为access under的专用端点mappings/mappings