【问题标题】:log4j: output file depending on source calling classlog4j:输出文件取决于源调用类
【发布时间】:2010-06-25 08:44:21
【问题描述】:

假设我有一个通用类,其中记录器由其名称初始化:

public class SomeCalculationLogic {
private static final Log log = LogFactory.getLog(SomeCalculationLogic .class);

public void doCalculation() {
    log.info("doing calculations...");
    ...
    }
}

这个类被两个逻辑上不同的流使用——比如说它是从类“BackgroundTask”和“UserRequest”中调用的。 如何根据调用类的不同,将 SomeCalculationLogic 的记录器的输出重定向到不同的日志文件(如 background.log 和 main.log)?

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    我看到了三种可能的方式:

    • 如果将所有消息记录到同一个文件中但根据上下文不同前缀它们就足够了,以便它们变得容易过滤,您可以使用 嵌套诊断上下文,如 @987654321 中所述@,
    • 如果您绝对需要单独的日志文件,您可以按照 Xavier 的建议,使用两个不同的记录器和关联的附加程序对您的类进行子类化(不幸的是,他的解决方案无法正常工作),
    • 或试试this alternative solution

    子类化解决方案的工作实现是这样的:

    public class SomeCalculationLogic {
      protected abstract Log getLog();
    
      public void doCalculation() {
        getLog().info("doing calculations...");
        ...
      }
    }
    
    public class BackgroundCalculationLogic extends SomeCalculationLogic {
      private static Log log = LogFactory.getLog(BackgroundCalculationLogic.class);
    
      protected Log getLog() {
        return log;
      }
    }
    
    public class UserRequestCalculationLogic extends SomeCalculationLogic {
      private static Log log = LogFactory.getLog(UserRequestCalculationLogic.class);
    
      protected Log getLog() {
        return log;
      }
    }
    

    【讨论】:

    • 只是一个小语法错误,缺少关键字“extends” ;)
    【解决方案2】:

    在你的 log4j.xml 中写这样的东西怎么样

    <appender name="main-logfile" class="org.apache.log4j.RollingFileAppender">
    <param name="file" value="${user.home}/.logs/main.log"/>
        <layout class="org.apache.log4j.PatternLayout">
        <param name="conversionPattern" value="%d %-5p %c{1}: %m%n"/>
    </layout>
    </appender>
    
    <logger name="com.calculationlogic.main" additivity="false">
    <appender-ref ref="main-logfile"/>
        <layout class="org.apache.log4j.PatternLayout">
        <param name="conversionPattern" value="%d %-5p %c{1}: %m%n"/>
    </layout>
    </logger>
    
    <appender name="background-logfile" class="org.apache.log4j.RollingFileAppender">
    <param name="file" value="${user.home}/.logs/background.log"/>
    </appender>
    
    <logger name="com.calculationlogic.background" additivity="false">
    <appender-ref ref="background-logfile"/>
    </logger>
    

    然后是java部分:

    public class SomeCalculationLogic {
        private final Category logger;
    
        public SomeCalculationLogic(final Category logger){
           this.logger = logger;
        }
    
        public void doCalculation() {
           log.info("doing calculations...");
        }
    }
    
    public class BackgroundTask{
      public BackgroundTask(){
          new SomeCalculationLogic(Logger.getLogger("com.calculationlogic.background")).doCalculation()
      }
    }
    
    public class MainTask{
      public MainTask(){
          new SomeCalculationLogic(Logger.getLogger("com.calculationlogic.main")).doCalculation()
      }
    }
    

    结果是: 在 background.log 中: 2010-06-25 14:23:35,496 INFO 背景:做计算...

    在 main.log 中: 2010-06-25 14:23:35,495 INFO main: 做计算...

    【讨论】:

      【解决方案3】:

      我建议使用继承而不是声明 final 字段。

      public class SomeCalculationLogic {
      private static Log log = LogFactory.getLog(SomeCalculationLogic .class);
      
      public void doCalculation() {
          log.info("doing calculations...");
          ...
          }
      }
      
      public class BackgroundCalculationLogic {
          private static Log log = LogFactory.getLog(BackgroundCalculationLogic .class);
      
      }
      
      public class UserRequestCalculationLogic {
          private static Log log = LogFactory.getLog(UserRequestCalculationLogic .class);
      }
      

      【讨论】:

      • log 应该声明为protected 才能正常工作。而且由于它的static,无论如何它都不会被子类数据成员“覆盖”:-(
      • 很好,我不知道你的解决方案要好得多,我倾向于-1,但我不会
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      相关资源
      最近更新 更多