Java 日志记录时在其他层中使用会话数据的正确方法
我想写一些包含执行者信息的信息日志。假设我有这个SaveUser函数:Java 日志记录时在其他层中使用会话数据的正确方法,java,logging,design-patterns,web,Java,Logging,Design Patterns,Web,我想写一些包含执行者信息的信息日志。假设我有这个SaveUser函数: public class UserDAO { Logger logger = LogManager.getLogger(); public void SaveUser(User user, LoggerInfo info) { logger.info("Executor {} trying to save user {}...", "Executor name comes here", us
public class UserDAO {
Logger logger = LogManager.getLogger();
public void SaveUser(User user, LoggerInfo info) {
logger.info("Executor {} trying to save user {}...", "Executor name comes here", user.name);
this.saveToFirstDB(user);
this.saveToSecondDB(user);
logger.info("Executor {} succesfully saved user {}.", "Executor name comes here", user.name);
}
private void SaveToFirstDB(User user) {
logger.info("Executor {}, enter SaveToFirstDB.", "Executor name comes here", user.name);
// save user to first db..
logger.info("Executor {}, exit SaveToFirstDB.", "Executor name comes here", user.name);
}
private void SaveToSecondDB(User user) {
logger.info("Executor {}, enter SaveToSecondDB.", "Executor name comes here", user.name);
I
// save user to second db..
logger.info("Executor {}, exit SaveToSecondDB.", "Executor name comes here", user.name);
}
}
我想在控制器层调用它:
public class UserController{
// for example - using Java Spark request and response context
public void SaveUser(Request req, Response res) {
User userToSave = new User(.....); // creating user object from request params
UserDAO userDAO = new UserDAO();
userDAO.SaveUser(userToSave);
// I want to use this executor name:
System.out.println(req.attribute("executor"));
}
}
当然我可以输入执行者的名字,但我不认为我应该这样做(这只是一个简单的例子,我想输入更多的细节,比如日期、角色等等)
我不想注入细节,也不想DAL(例如)知道控制器层的上下文对象(Play、Spark…)。
那么,在后端编写信息日志的正确方法是什么呢?您可以使用Log4j映射的诊断上下文。在这种方法中,您可以编写请求拦截器或servlet过滤器来设置log4jmdc中的其他属性。 您的servlet过滤器如下所示-
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
/*
* This code puts the value "userName" to the Mapped Diagnostic
* context. Since MDc is a static class, we can directly access it
* with out creating a new object from it. Here, instead of hard
* coding the user name, the value can be retrieved from a HTTP
* Request object.
*/
MDC.put("userName", req.attribute("executor"));
MDC.put("date", System.currentTimeMilis());
MDC.put("role", getRole());
//Any other properties you want to set
chain.doFilter(request, response);
} finally {
MDC.remove("userName");
}
}
然后可以为UserDao类编写cutomize log4j模式
[%d{ISO8601}] %X{userName} %X{role} %p %c - %m%n
以上语法仅供参考。您可以使用Log4j映射的诊断上下文。在这种方法中,您可以编写请求拦截器或servlet过滤器来设置log4jmdc中的其他属性。 您的servlet过滤器如下所示-
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
/*
* This code puts the value "userName" to the Mapped Diagnostic
* context. Since MDc is a static class, we can directly access it
* with out creating a new object from it. Here, instead of hard
* coding the user name, the value can be retrieved from a HTTP
* Request object.
*/
MDC.put("userName", req.attribute("executor"));
MDC.put("date", System.currentTimeMilis());
MDC.put("role", getRole());
//Any other properties you want to set
chain.doFilter(request, response);
} finally {
MDC.remove("userName");
}
}
然后可以为UserDao类编写cutomize log4j模式
[%d{ISO8601}] %X{userName} %X{role} %p %c - %m%n
以上语法仅供参考。这正是我们在我的工作中所做的这正是我们在我的工作中所做的