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 Log4j登录调用类_Java_Logging_Log4j - Fatal编程技术网

Java Log4j登录调用类

Java Log4j登录调用类,java,logging,log4j,Java,Logging,Log4j,我在一个项目中使用Log4j,根据调用类所在的包将其日志重定向到多个不同的文件。但是,我的项目有一些在整个项目中使用的util类,我希望根据调用类将它们的日志附加到相应的日志中。如果出现错误,我可以抛出异常,但如果出现警告,这不是一个好主意。是否有办法根据调用类“重定向”util类的日志?您可以使用stacktrace获取调用方(请参阅),但这可能会影响应用程序的性能 另一种选择是使用线程本地存储来设置当前使用的记录器——但在我看来,这还是有点过头了 我不知道有什么“标准”的方法可以做到这一点…

我在一个项目中使用Log4j,根据调用类所在的包将其日志重定向到多个不同的文件。但是,我的项目有一些在整个项目中使用的util类,我希望根据调用类将它们的日志附加到相应的日志中。如果出现错误,我可以抛出异常,但如果出现警告,这不是一个好主意。是否有办法根据调用类“重定向”util类的日志?

您可以使用stacktrace获取调用方(请参阅),但这可能会影响应用程序的性能

另一种选择是使用线程本地存储来设置当前使用的记录器——但在我看来,这还是有点过头了


我不知道有什么“标准”的方法可以做到这一点…

我想向您推荐两种解决方案:

  • 第一种方法是将所有消息记录到同一个文件中,但根据上下文的不同,为它们添加不同的前缀,以便可以轻松地对其进行筛选

  • 第二是尝试类似的方法。它有一个最简单的解决方案,可以将特定类的输出记录到特定的appender:-)


  • 如果你的项目不大,重构也不会是个大问题,我会放弃静态方法。这样,您就可以使用injection将
    记录器
    传递到实用程序类,无论您在哪里需要它:

    public class MyUtils {
      private final Logger logger;
    
      public MyUtils (Logger logger) {
         this.logger = logger;
      }
    
      public void doSomething(...) {
         // use the logger
      }
    }
    
    然后在最顶层的父类中实例化实用程序类,并在子类中使用相同的实用程序类;差不多

    public abstract class BaseClass {
    
       // You can use log4j to log in different files; 
       // e.g. you would probably want all child classes of BaseClass to use the same log
       private static final Logger LOGGER = Logger.getLogger("some_log");
    
       // Doesn't have to be static, but one instance would be enough in this case
       private static final MyUtils UTILS = new MyUtils(LOGGER);
    
    }
    
    然后在子类中,您将使用如下实用程序类:

    getUtils().doSomething();