Log4j - 创建具有相同属性的另一个appender

时间:2015-02-20 08:38:36

标签: java log4j

在我的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的appender,其属性与之前配置的INFOFILE appender相同(文件和阈值属性除外,我将在稍后覆盖这些属性)。

我知道我可以在属性文件中重写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

谢谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

不,继续&#34;继承&#34;来自另一个appender的属性。用于解析属性文件(PropertyConfigurator类)的代码首先列出所有已定义的appender,并为每个appender查找log4j.appender.<name>键。相应的值应该是一个类。我在代码中找不到任何可以重用先前定义的appender的东西。这意味着您必须指定appender的每个属性。

您可以通过使用委托appender创建自己的appender类来实现。然后在属性文件中,将delegate属性设置为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

似乎有效。

答案 2 :(得分:0)

这是一个简单的示例,您必须使用特定于应用程序的包或任何硬编码的记录器名称字符串更改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