当前位置: 首页 > 知识库问答 >
问题:

如何在Log4J2中正确地使用AppenderComponentBuilder创建RollingFileAppender

弘涛
2023-03-14

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

// 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)您认为这是使用Log4J2 API以编程方式创建记录器和系统日志追加器的最佳方式吗?

2)我想扩展上面的createLogger()方法,以便它将根据用户的选择创建适当的追加器:file、syslog,两者都是。“file”选项应该创建一个具有特定模式布局、触发策略和滚动策略的滚动文件追加器。我尝试使用相同的Log4J2 API并使用AppenderComponentBuilder来完成此操作,但我找不到正确的方法。我设法以编程方式做到这一点的唯一方法是使用rollingFileAppender.createAppender()方法,这是一个非常麻烦的问题,使我很难以编程方式动态创建一个带有滚动文件追加器、syslog追加器或两者(取决于用户输入)的记录器。

提前致谢

共有1个答案

龙志勇
2023-03-14

>

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

    下面是一个如何创建滚动文件追加器的示例。由于可以用任意组件配置追加器,因此可以使用通用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());
    

  •  类似资料:
    • 问题内容: 我正在尝试使用Bokeh而不是matplotlib复制此问题中显示的HeatMap。我不能完全正确。现有的示例并没有帮助我了解我在做什么错。我卑微的尝试 给 请注意,尽管标题相似,但这并不能回答我的问题。这不是相同的错误,我正在使用Bokeh 0.12.3 问题答案: 更改数据的生成以按元素重复,并且它应该是正确的: 因此,适用于我的代码如下:

    • 我正在使用带区签出自定义集成-https://Stripe.com/docs/Checkout#integration-custom-,方法如下: 使用custom而不是simple-如何修改带区签出以发送AJAX请求?-因为simple不允许我进行AJAX调用。 https://stripe.com/docs/tutorials/charges 搜索-12的结果,没有太大帮助。

    • 问题内容: 我正在尝试在Log4j2中编写自己的RewritePolicy。该文档指出: RewritePolicy是一个接口,允许实现在将LogEvent传递给Appender之前检查并可能对其进行修改。RewritePolicy声明一个必须执行的名为rewrite的方法。该方法通过LogEvent传递,并且可以返回相同事件或创建一个新事件。 这是我的 java类 : 这是我的 yaml配置 文

    • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 我有一个打算用作实用程序文件的文件。该文件应包含许多静态方法。 我应该这样在类中定义方法吗: 或像这样使用它(不带类): 问题答案: 第二个选项是Python中的操作方法。我的意思是,如果您要做的只是导入函数,那么您可以执行以下操作:

    • 问题内容: 我不知道最好的方法是创建具有属性和方法的JavaScript对象。 我看过一些示例,该示例中的人员使用然后在所有功能中使用以确保范围始终正确。 然后,我看到了用于添加属性的示例,而其他示例则是内联的。 有人可以给我一个带有某些属性和方法的JavaScript对象的正确示例吗? 问题答案: 有两种用于在JavaScript中实现类和实例的模型:原型方式和闭包方式。两者都有优点和缺点,并且

    • 我正在尝试在log4j2中编写自己的RewritePolicy。文件指出: 然而,我不知道如何将它注入我的配置文件。我如何使它在运行时工作?

    • 这就是我所拥有的理想构建脚本: 我确实想手动执行任务“unzip_natives_os”。但它似乎只在配置阶段起作用。当我用这个设置进行测试运行时,它会给我一个错误:“java.lang.UnsatifiedLinkError”,但是如果我在dependencies块中将配置从“NativeSos”更改为“RuntimeOnly”,它就能正常工作。我是否必须显式地创建这个“ApplicationD

    • 我是Android开发的新手,我正试图从服务器获取数据。一般的JSON响应结构如下所示 “Success”和“Message”字段将是相同的(将始终是字符串)。但是对于其他请求调用,“数据”可能不同。它可以发送用户数据,存储数据或产品数据,甚至是产品的数组/列表。 因此,我想创建一个通用的可重用类来捕捉JSON响应。类将如下所示,我将“data”设置为Any,然后稍后它将被铸回User Objec