【问题标题】:How to do programmatic configuration for log4j2 RollingFileAppender如何为 log4j2 RollingFileAppender 进行编程配置
【发布时间】:2014-09-30 11:32:32
【问题描述】:

我在没有配置文件的情况下以编程方式使用 log4j2,而是在代码中配置它。我正在尝试使用 log4j2 RollingFileAppender 来保存最后 10 个日志文件。我尝试使用SizeBasedTriggeringPolicy 限制文件大小。大小限制有效,但它不会创建旧的日志文件,只会继续删除并写入一个原始日志文件。

public static void configLog() {
        String dir = System.getProperty("java.io.tmpdir") + "test\\";
        final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        final Configuration config = ctx.getConfiguration();
        PatternLayout layout = PatternLayout.newBuilder().withConfiguration(config).withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN).build();
        SizeBasedTriggeringPolicy policy = SizeBasedTriggeringPolicy.createPolicy("1KB");
        DefaultRolloverStrategy strategy = DefaultRolloverStrategy.createStrategy("10", "0", null, null, config);
        RollingFileManager fileManager = RollingFileManager.getFileManager(dir + "log\\test.log", dir + "log\\test-%i.log", false, false, policy, strategy, null, layout, 128);
        policy.initialize(fileManager);
        RollingFileAppender appender = RollingFileAppender.createAppender(dir + "log\\test.log", dir + "log\\test-%i.log",
                "false", "File", "false", "128", "true", policy, strategy, layout, (Filter) null, "false", "false", (String) null, config);
        appender.start();
        config.addAppender(appender);
        AppenderRef ref = AppenderRef.createAppenderRef("File", Level.INFO, null);
        AppenderRef[] refs = new AppenderRef[] { ref };
        LoggerConfig loggerConfig = LoggerConfig.createLogger("true", Level.INFO, LogManager.ROOT_LOGGER_NAME, "true",
                refs, null, config, null);
        loggerConfig.addAppender(appender, Level.INFO, null);
        config.addLogger(LogManager.ROOT_LOGGER_NAME, loggerConfig);
        ctx.updateLoggers();
    }

我没有找到很多使用 java 配置日志记录的示例,但我的应用程序需要这样做。我取大部分代码的例子在这里http://logging.apache.org/log4j/2.x/manual/customconfig.html(第二个代码部分)。

为什么不创建/保存旧的日志文件?

【问题讨论】:

    标签: java log4j2


    【解决方案1】:

    尽管这是一个老问题,其他人可能会觉得它很有用,但我相信这是因为

    RollingFileAppender.createAppender(dir + "log\\test.log", dir + "log\\test-%i.log",
                "false", "File", "false", "128", "true", policy, strategy, layout, (Filter) null, "false", "false", (String) null, config);
    

    应该是

    RollingFileAppender.createAppender(dir + "log\\test.log", dir + "log\\test-%i.log",
                "true", "File", "false", "128", "true", policy, strategy, layout, (Filter) null, "false", "false", (String) null, config);
    

    第三个参数是附加选项 https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/RollingFileAppender.html

    【讨论】:

    • 证明 Log4j 团队不关心编程初始化的简易性(我更喜欢没有编译时安全性的 XML:它只是在运行时不记录,而且失败通常是无声的)。
    • 他们已经添加了构建器,这应该使它变得相当容易。不幸的是,当我升级一段时间后,这对我来说不可用,而且很难获得正确的编程配置。
    • 我只是在玩较新的版本,它是如此基于字符串的事实使我的一半目的失败了——在编译器的帮助下正确设置值(你只是发现它只是不在运行时不工作)。它基本上是半弱类型的,几乎不比 java 代码中的 xml 更好。而且 Logback 与 slf4j 交织在一起,以至于如果另一个依赖项导入了 log4j,你就无法让它使用 logback。 #logginghell
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    相关资源
    最近更新 更多