【发布时间】:2019-03-20 10:23:46
【问题描述】:
我想以最少的重构将日志系统添加到我们的 Spring MVC 应用程序中。我想根据请求对消息进行分组并附加一些 id 到它。我想到的一种方法是,在控制器中创建一些带有id 的记录器对象并传递给服务、DAO 层。所有层都不断向该记录器对象添加消息。最后,我在请求处理结束时打印它们。 Spring 或 log4j 框架是否提供了更好的方法来实现这一点?
【问题讨论】:
我想以最少的重构将日志系统添加到我们的 Spring MVC 应用程序中。我想根据请求对消息进行分组并附加一些 id 到它。我想到的一种方法是,在控制器中创建一些带有id 的记录器对象并传递给服务、DAO 层。所有层都不断向该记录器对象添加消息。最后,我在请求处理结束时打印它们。 Spring 或 log4j 框架是否提供了更好的方法来实现这一点?
【问题讨论】:
Spring 有一个 Request 范围,因此您可以创建一个在收到请求时生成的请求范围 ID 对象。然后,您可以将此对象注入您需要使用常规依赖注入记录的类中,因此您不必传递任何内容。
@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public RequestId requestScopedBean() {
return new RequestId();
}
对于 Log,通常的做法是为每个类初始化一个 Log。然后你就会在每个类中都有你想要的所有元素。
private static final Logger logger = Logger.getLogger(YourClass.java)
希望对你有帮助!
【讨论】:
Spring Security 具有自动将 SessionId 添加到记录器的功能。 Check this One
在这里发布相同的答案:
RequestContextHolder.currentRequestAttributes().getSessionId();
这依赖于 Spring 的 RequestContextHolder,所以它应该与 Spring MVC 的 DispatcherServlet 一起使用,或者你应该声明一个 RequestContextListener。如果不存在,也会创建会话。
【讨论】: