【问题标题】:Log4j - Create another appender with same propertiesLog4j - 创建另一个具有相同属性的附加程序
【发布时间】:2015-02-20 08:38:35
【问题描述】:

在我的 log4j 属性文件中,我将根记录器配置为 DailyRollingFileAppender。它的名称是 INFOFILE。这是我的属性文件。

log4j.rootLogger = debug, INFOFILE
log4j.appender.INFOFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.INFOFILE.File=D:/INOVA/RequestBroker/logs/mog.log
log4j.appender.INFOFILE.ImmediateFlush=true
log4j.appender.INFOFILE.Threshold=debug
log4j.appender.INFOFILE.Append=true
log4j.appender.INFOFILE.DatePattern='.' yyyy-MM-dd-a
log4j.appender.INFOFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.INFOFILE.layout.conversionPattern=%-5p %m%n

现在我需要另一个名为 ERRORFILE 的附加程序,其属性与先前配置的 INFOFILE 附加程序相同(文件和阈值属性除外,我稍后将覆盖这些属性)。

我知道我可以在属性文件中重写 ERRORFILE appender 的所有上述属性。或者我可以在我的 java 代码中将 INFOFILE appender 的所有属性复制到 ERRORFILE appender。但在此之前,我想知道是否有任何方法可以将 INFOFILE appender 的属性扩展到 ERRORFILE appender。

编辑:

例如,我希望在 log4j.properties 文件中为 ERRORFILE appender 提供类似的内容。

log4j.appender.ERRORFILE.parent=INFOFILE
log4j.appender.ERRORFILE.File=D:/INOVA/RequestBroker/logs/mog-error.log
log4j.appender.ERRORFILE.Threshold=error

谢谢。

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    不是真正的扩展,但你可以这样做:

    log4j.appender.NEWLOGGER=${log4j.appender.INFOLOGGER}
    log4j.appender.NEWLOGGER.File=${log4j.appender.INFOLOGGER.File}
    ...
    

    等等。 Log4J 支持变量替换。在这里阅读:https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html

    【讨论】:

    • 嗨,你能解释一下你的第一行是做什么的吗?还需要把INFOLOGGER的所有属性一一复制到NEWLOGGER吗?
    • 您需要复制密钥,是的。没有办法解决它。但是对于值,您可以参考 INFOLOGGER 属性。
    • 非常感谢。为什么他们没有设计它来将 INFOLOGGER 的所有属性复制到 NEWLOGGER 行 log4j.appender.NEWLOGGER=${log4j.appender.INFOLOGGER} :(
    • 真棒...随意实施它并向开发团队提出补丁建议。
    【解决方案2】:

    不,不可能从另一个附加程序“继承”属性。用于解析属性文件(PropertyConfigurator 类)的代码首先列出所有已定义的附加程序,并为每个附加程序查找log4j.appender.<name> 键。对应的值应该是一个类。我没有在代码中找到任何可以让您重用先前定义的附加程序的内容。这意味着您必须指定 appender 的每个属性。

    您可以通过使用委托附加程序创建自己的附加程序类来做到这一点。然后在属性文件中,将委托属性设置为 INFOFILE。

    我对以下课程进行了快速测试:

    public class MyAppender extends AppenderSkeleton {
    
        private String delegate;
    
        public String getDelegate() {
            return delegate;
        }
    
        public void setDelegate(final String delegate) {
            this.delegate = delegate;
        }
    
        @Override
        public void close() {
            Logger.getRootLogger().getAppender(delegate).close();
        }
    
        @Override
        public boolean requiresLayout() {
            // We won't set the layout in the configuration file
            return false;
        }
    
        @Override
        protected void append(final LoggingEvent event) {
            Logger.getRootLogger().getAppender(delegate).doAppend(event);
        }
    }
    

    然后进行如下配置:

    log4j.appender.ERRORFILE = org.example.MyAppender
    log4j.appender.ERRORFILE.delegate = INFOFILE
    

    它似乎有效。

    【讨论】:

      【解决方案3】:

      这是一个简单的示例,您必须使用特定于应用程序的包或任何硬编码的记录器名称字符串来更改 org.myapppackagepattern

      log4j.rootLogger = debug, INFOFILE
      log4j.appender.INFOFILE=org.apache.log4j.DailyRollingFileAppender
      log4j.appender.INFOFILE.File=D:/INOVA/RequestBroker/logs/mog.log
      log4j.appender.INFOFILE.ImmediateFlush=true
      log4j.appender.INFOFILE.Threshold=debug
      log4j.appender.INFOFILE.Append=true
      log4j.appender.INFOFILE.DatePattern='.' yyyy-MM-dd-a
      log4j.appender.INFOFILE.layout=org.apache.log4j.PatternLayout
      log4j.appender.INFOFILE.layout.conversionPattern=%-5p %m%n
      
      log4j.logger.org.myapppackagepattern=DEBUG, NEWLOGGER
      log4j.appender.NEWLOGGER=org.apache.log4j.DailyRollingFileAppender
      log4j.appender.NEWLOGGER.File=D:/INOVA/RequestBroker/logs/newlogger.log
      log4j.appender.NEWLOGGER.ImmediateFlush=true
      log4j.appender.NEWLOGGER.Threshold=debug
      log4j.appender.NEWLOGGER.Append=true
      log4j.appender.NEWLOGGER.DatePattern='.' yyyy-MM-dd-a
      log4j.appender.NEWLOGGER.layout=org.apache.log4j.PatternLayout
      log4j.appender.NEWLOGGER.layout.conversionPattern=%-5p %m%n
      

      【讨论】:

      • 感谢您的回复。但我这里要的是避免这种属性的重复。在您的示例中,ImmediateFlush,Append, layout... 属性对于两个附加程序都是重复的。我想避免这种情况。我将编辑我的问题以使其更清楚。
      • 我怀疑你是否可以避免重复,每个 appender 都有自己的属性,我看起来是重复的,但它们不是。以编程方式创建附加程序的更好方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2015-05-01
      • 1970-01-01
      • 2012-06-24
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多