Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 日志记录时在其他层中使用会话数据的正确方法_Java_Logging_Design Patterns_Web - Fatal编程技术网

Java 日志记录时在其他层中使用会话数据的正确方法

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

我想写一些包含执行者信息的信息日志。假设我有这个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", 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

以上语法仅供参考。

这正是我们在我的工作中所做的这正是我们在我的工作中所做的