如何在log4j 2中使用AppenderComponentBuilder正确创建RollingFileAppender

时间:2016-01-20 15:40:14

标签: java logging log4j log4j2

我希望用户选择将通过可配置选项创建的appender的类型。

例如,假设我有一个命令行参数来控制将为该进程创建的appender的类型。用户可以选择以下值之一:file,syslog或两者。

我想以编程方式执行此操作,而不是使用外部xml配置文件。

这是我尝试以编程方式使用syslog appender创建记录器的简化版本。

// simplified version of a method that creates and returns a logger
// using AppenderComponentBuilder
static Logger createLogger()
{
        ConfigurationBuilder< BuiltConfiguration > builder =
                ConfigurationBuilderFactory.newConfigurationBuilder();

        builder.setStatusLevel( Level.OFF );

        // create the syslog appender
        AppenderComponentBuilder appenderBuilder =
                builder.newAppender( "syslogAppender", "Syslog" )
                .addAttribute( "protocol", "TCP" )
                .addAttribute( "host", "localhost" )
                .addAttribute( "port", 514 )
                .addAttribute( "facility", "LOCAL2" )
                .addAttribute( "immediateFlush", true )
                .addAttribute( "newLine", true );
        builder.add( appenderBuilder );

        // create the new logger
        builder.add( builder.newLogger( "TestLogger", Level.DEBUG )
                .add( builder.newAppenderRef( "syslogAppender" ) )
                .addAttribute( "additivity", false ) );

        builder.add( builder.newRootLogger( Level.DEBUG )
                .add( builder.newAppenderRef( "syslogAppender" ) ) );

        // Initialize the new configuration
        LoggerContext ctx = Configurator.initialize( builder.build() );
        Logger logger = ctx.getLogger( "TestLogger" );
        return logger;
}

我的问题:

1)您是否认为这是使用log4j 2 API以编程方式创建记录器和syslog appender的最佳方式?

2)我想扩展上面的createLogger()方法,以便根据用户选择创建正确的appender:file,syslog,两者。 “file”选项应该创建一个Rolling文件appender,它具有特定的模式布局,触发策略和翻转策略。我尝试使用相同的log4j 2 API并使用AppenderComponentBuilder来执行此操作,但我找不到正确的方法。我设法以编程方式执行此操作的唯一方法是使用RollingFileAppender.createAppender()方法,这是一个真正的痛苦,并且很难让我以编程方式动态创建具有滚动文件追加器的单个记录器,syslog appender或两者(取决于用户输入)。

因此,从本质上讲,我正在寻找的是使用AppenderComponentBuilder以编程方式创建具有特定模式布局,触发策略和翻转策略的RollingFileAppender的正确方法。

提前致谢

1 个答案:

答案 0 :(得分:2)

  1. 是的,这是以编程方式创建新配置的预期方式。

  2. 以下是如何创建滚动文件追加程序的示例。由于Appender可以配置任意组件,因此您可以使用通用ComponentBuilder来指定这些插件。

    ConfigurationBuilder< BuiltConfiguration > builder =
            ConfigurationBuilderFactory.newConfigurationBuilder();
    
    builder.setStatusLevel( Level.ERROR);
    builder.setConfigurationName("RollingBuilder");
    // create the console appender
    AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE").addAttribute("target",
            ConsoleAppender.Target.SYSTEM_OUT);
    appenderBuilder.add(builder.newLayout("PatternLayout").
            addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
    builder.add( appenderBuilder );
    
    LayoutComponentBuilder layoutBuilder = builder.newLayout("PatternLayout")
            .addAttribute("pattern", "%d [%t] %-5level: %msg%n");
    ComponentBuilder triggeringPolicy = builder.newComponent("Policies")
            .addComponent(builder.newComponent("CronTriggeringPolicy").addAttribute("schedule", "0 0 0 * * ?"))
            .addComponent(builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", "100M"));
    appenderBuilder = builder.newAppender("rolling", "RollingFile")
            .addAttribute("fileName", "target/rolling.log")
            .addAttribute("filePattern", "target/archive/rolling-%d{MM-dd-yy}.log.gz")
            .add(layoutBuilder)
            .addComponent(triggeringPolicy);
    builder.add(appenderBuilder);
    
    // create the new logger
    builder.add( builder.newLogger( "TestLogger", Level.DEBUG )
            .add( builder.newAppenderRef( "rolling" ) )
            .addAttribute( "additivity", false ) );
    
    builder.add( builder.newRootLogger( Level.DEBUG )
            .add( builder.newAppenderRef( "rolling" ) ) );
    Configurator.initialize(builder.build());