Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用log4j 2中的AppenderComponentBuilder正确创建RollingFileAppender_Java_Logging_Log4j_Log4j2 - Fatal编程技术网

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

Java 如何使用log4j 2中的AppenderComponentBuilder正确创建RollingFileAppender,java,logging,log4j,log4j2,Java,Logging,Log4j,Log4j2,我希望用户选择通过可配置选项创建的附加器类型 例如,假设我有一个命令行参数,它控制将为该进程创建的附加器的类型。用户可以选择以下值之一:file、syslog或两者 我希望以编程的方式完成这项工作,而不是使用外部xml配置文件 这是我尝试以编程方式创建带有syslog appender的记录器的简化版本 // simplified version of a method that creates and returns a logger // using AppenderComponentBui

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

例如,假设我有一个命令行参数,它控制将为该进程创建的附加器的类型。用户可以选择以下值之一: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;
}
//创建并返回记录器的方法的简化版本
//使用AppenderComponentBuilder
静态记录器createLogger()
{
ConfigurationBuilderbuilder=
ConfigurationBuilderFactory.newConfigurationBuilder();
建造商设置状态水平(水平关闭);
//创建系统日志附加程序
附录组件生成器附录生成器=
builder.newAppender(“syslogAppender”、“Syslog”)
.addAttribute(“协议”、“TCP”)
.addAttribute(“主机”、“本地主机”)
.addAttribute(“端口”,514)
.addAttribute(“设施”、“本地2”)
.addAttribute(“立即刷新”,true)
.addAttribute(“换行符”,true);
builder.add(appenderBuilder);
//创建新的记录器
add(builder.newLogger(“TestLogger”,Level.DEBUG)
.add(builder.newAppenderRef(“syslogAppender”))
.addAttribute(“可加性”,false));
builder.add(builder.newRootLogger(Level.DEBUG)
.add(builder.newAppenderRef(“syslogAppender”));
//初始化新配置
LoggerContext ctx=Configurator.initialize(builder.build());
Logger Logger=ctx.getLogger(“测试记录器”);
返回记录器;
}
我的问题是:

1) 您认为这是使用log4j2api以编程方式创建记录器和syslog appender的最佳方式吗

2) 我想扩展上面的createLogger()方法,以便根据用户的选择创建适当的appender:file、syslog,两者都有。“file”选项应该创建一个具有特定模式布局、触发策略和滚动策略的滚动文件追加器。我尝试使用相同的log4j2api和AppenderComponentBuilder来实现这一点,但我找不到正确的方法。我通过编程实现这一点的唯一方法是使用RollingFileAppender.createAppender()方法,这是一个真正的难题,并且使我很难通过编程方式动态创建一个带有滚动文件appender、syslog appender或两者(取决于用户输入)的单个记录器

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

提前谢谢

  • 是的,这是以编程方式创建新配置的预期方法

  • 下面是一个如何创建滚动文件追加器的示例。由于可以使用任意组件配置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());
    
    ConfigurationBuilderbuilder=
    ConfigurationBuilderFactory.newConfigurationBuilder();
    builder.setStatusLevel(Level.ERROR);
    builder.setConfigurationName(“RollingBuilder”);
    //创建控制台附加程序
    AppenderComponentBuilder appenderBuilder=builder.newAppender(“标准输出”、“控制台”).addAttribute(“目标”,
    ConsolePender.Target.SYSTEM_OUT);
    add(builder.newLayout(“PatternLayout”)。
    addAttribute(“模式”,%d[%t]-5级别:%msg%n%throwable”);
    builder.add(appenderBuilder);
    LayoutComponentBuilder layoutBuilder=builder.newLayout(“PatternLayout”)
    .addAttribute(“模式”,%d[%t]-5级别:%msg%n);
    ComponentBuilder triggeringPolicy=builder.newComponent(“策略”)
    .addComponent(builder.newComponent(“CronTriggeringPolicy”).addAttribute(“计划”、“0**?”)
    .addComponent(builder.newComponent(“SizeBasedTriggeringPolicy”).addAttribute(“size”,“100M”));
    appenderBuilder=builder.newAppender(“滚动”、“滚动文件”)
    .addAttribute(“文件名”、“目标/rolling.log”)
    .addAttribute(“filePattern”,“target/archive/rolling-%d{MM-dd-yy}.log.gz”)
    .add(布局生成器)
    .addComponent(触发策略);
    builder.add(appenderBuilder);
    //创建新的记录器
    add(builder.newLogger(“TestLogger”,Level.DEBUG)
    .add(builder.newAppenderRef(“滚动”))
    .addAttribute(“可加性”,false));
    builder.add(builder.newRootLogger(Level.DEBUG)
    .add(builder.newAppenderRef(“滚动”));
    Configurator.initialize(builder.build());
    
  • 是的,这是以编程方式创建新配置的预期方法

  • 下面是一个如何创建滚动文件追加器的示例。由于可以使用任意组件配置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());
    
    ConfigurationBuilderbuilder=
    ConfigurationBuilderFactory.newConfigurationBuilder();
    builder.setStatusLevel(Level.ERROR);
    builder.setConfigurationName(“RollingBuilder”);
    //创建控制台附加程序
    AppenderComponentBuilder appenderBuilder=builder.newAppender(“标准输出”、“控制台”).addAttribute(“目标”,
    ConsolePender.Target.SYSTEM_OUT);
    add(builder.newLayout(“PatternLayout”)。
    addAttribute(“模式”,%d[%t]-5级别:%msg%n%throwable”);
    builder.add(appenderBuilder);
    LayoutComponentBuilder layoutBuilder=builder.newLayout(“PatternLayout”)
    .addAttribute(“patt