gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:05:27 26 4
gpt4 key购买 nike

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

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

我想以编程方式执行此操作,而不是使用外部 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());

关于java - 如何在 log4j 2 中使用 AppenderComponentBuilder 正确创建 RollingFileAppender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34904304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com