java - 为什么 Log4j2 Appender 不将下一行中的第一个日志添加到 header ?

标签 java logging log4j2

我正在以编程方式创建一个 log4j2 记录器并向其添加附加程序。 但我注意到的一件事是,在写入第一条日志消息时,日志消息会附加到 header 中。

例如

header[2020-01-21 21:16:07,176][ERROR] - the error message
[2020-01-21 21:16:07,176][ERROR] - text message

预期的是:

header
[2020-01-21 21:16:07,176][ERROR] - the error message
[2020-01-21 21:16:07,176][ERROR] - text message

下面是我试图实现此目的的代码片段:

@SpringBootApplication
public class Log4j2TestApplication {

public static void main(String[] args) {
    SpringApplication.run(Log4j2TestApplication.class, args);
    String loggerName = "testLogger";
    final ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();

    final LoggerComponentBuilder loggerComp = builder.newLogger(loggerName, Level.ALL).addAttribute("additivity",
            false);

    builder.add(loggerComp);
    builder.setConfigurationSource(null);
    Configuration configuration = builder.build();
    LoggerContext ctx = Configurator.initialize(builder.build());
    ctx.start(configuration);
    ctx.updateLoggers(configuration);
    Logger logger = ctx.getLogger(loggerName);
    Appender textAppender = createTextAppender(configuration);
    textAppender.start();
    logger.addAppender(textAppender);
    logger.error("the error message", "Test Paramter");
    logger.error("text message", "Test Paramter");
    textAppender.stop();
}

private static Appender createTextAppender(final Configuration config) {

    final Layout<String> layout = getTextLayout(config, "header");

    return RollingFileAppender.newBuilder().setConfiguration(config).setName("txtAppender")
            .withFileName("TestFile.text").withFilePattern("TestFile.txt")
            .withPolicy(SizeBasedTriggeringPolicy.createPolicy("100M"))
            .withStrategy(DefaultRolloverStrategy.newBuilder().withConfig(config).build()).withImmediateFlush(true)
            .setFilter(ThresholdFilter.createFilter(Level.ALL, Result.ACCEPT, Result.DENY)).setLayout(layout)
            .build();
}

private static Layout<String> getTextLayout(final Configuration config, final String header) {
    return PatternLayout.newBuilder().withConfiguration(config).withCharset(StandardCharsets.UTF_8)
            .withPattern("[%d][%-5.-5p] - %m%n").withHeader(header).build();
    }
}

为什么会出现这种行为以及我们如何将第一条消息放到第二行?

最佳答案

您的示例输出显示“dummyHeader”,但您的代码显示“header”。如果您想要换行符,请将其更改为“header\n”。

关于java - 为什么 Log4j2 Appender 不将下一行中的第一个日志添加到 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59841846/

相关文章:

java.util.Logger 创建的文件比应有的多

java - 以帕斯卡为单位的高斯

python - 测试 - 如何让所有记录器打印输出

java - 我必须将文件放在哪里才能使用文件附加器 log4j2

java - 无法使用 apache httpComponent 和 log4j2 输出日志

java - 如何使用相对路径-Java

java - 使用 jsoup 获取表的内容

java - BluetoothSocket isConnected() 函数在运行时导致 java.lang.NoSuchMethodError

java - 以编程方式更改 Log4j 2.x 的输出格式

java - Log4j2 SMTP 附加程序 "Must issue a STARTTLS command first"