Java 如何使用log4j 2中的AppenderComponentBuilder正确创建RollingFileAppender
我希望用户选择通过可配置选项创建的附加器类型 例如,假设我有一个命令行参数,它控制将为该进程创建的附加器的类型。用户可以选择以下值之一:file、syslog或两者 我希望以编程的方式完成这项工作,而不是使用外部xml配置文件 这是我尝试以编程方式创建带有syslog appender的记录器的简化版本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
// 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的正确方法
提前谢谢
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());
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