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

How to properly create a RollingFileAppender with AppenderComponentBuilder in log4j 2

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

例如,假设我有一个命令行参数来控制将为该进程创建的附加程序的类型。用户可以选择以下值之一:文件、系统日志或两者。

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

这是我尝试以编程方式创建带有系统日志附加程序的记录器的简化版本。

// 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 以编程方式创建记录器和系统日志附加程序的最佳方式吗?

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

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

提前致谢

  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());