Java 为什么Log4j2追加器不将下一行中的第一个日志添加到头中?
我正在以编程方式创建一个log4j2记录器,并向其添加appender。 但我注意到的一点是,在编写第一条日志消息时,日志消息被附加到头中 比如说Java 为什么Log4j2追加器不将下一行中的第一个日志添加到头中?,java,logging,log4j2,Java,Logging,Log4j2,我正在以编程方式创建一个log4j2记录器,并向其添加appender。 但我注意到的一点是,在编写第一条日志消息时,日志消息被附加到头中 比如说 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
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();
}
}
@springboot应用程序
公共类Log4j2TestApplication{
公共静态void main(字符串[]args){
run(Log4j2TestApplication.class,args);
字符串loggerName=“testLogger”;
final ConfigurationBuilder=ConfigurationBuilderFactory.newConfigurationBuilder();
最终LoggerComponentBuilder loggerComp=builder.newLogger(loggerName,Level.ALL).addAttribute(“可加性”,
假);
建造商添加(loggerComp);
builder.setConfigurationSource(空);
配置=builder.build();
LoggerContext ctx=Configurator.initialize(builder.build());
启动(配置);
更新记录器(配置);
Logger Logger=ctx.getLogger(loggerName);
Appender textapper=createtextapper(配置);
textAppender.start();
logger.addAppender(textpappender);
logger.error(“错误消息”、“测试参数”);
logger.error(“文本消息”、“测试参数”);
textAppender.stop();
}
专用静态Appender createTextAppender(最终配置){
最终布局=getTextLayout(配置,“标题”);
返回RollingFileAppender.newBuilder().setConfiguration(config).setName(“txtAppender”)
.withFileName(“TestFile.text”).withFilePattern(“TestFile.txt”)
.withPolicy(SizeBadeTriggeringPolicy.createPolicy(“100M”))
.withStrategy(DefaultRolloverStrategy.newBuilder().withConfig(config.build()).withImmediateFlush(true)
.setFilter(ThresholdFilter.createFilter(Level.ALL、Result.ACCEPT、Result.DENY)).setLayout(布局)
.build();
}
私有静态布局getTextLayout(最终配置配置,最终字符串头){
返回PatternLayout.newBuilder().withConfiguration(config).withCharset(StandardCharsets.UTF_8)
.withPattern(“[%d][%5.-5p]-%m%n”).withHeader(header.build();
}
}
为什么会出现这种行为?我们如何将第一条消息发送到第二行?您的示例输出显示“dummyHeader”,但您的代码显示“header”。如果需要换行符,请将其更改为“header\n” 在添加
loggerName
?示例输出显示“dummyHeader”,但代码显示“header”。如果您需要换行符,请将其更改为“header\n”。很抱歉,我想我不明白,为什么我要附加loggerName以及它应该附加在哪里?@rgoers它只是供参考,但我根据程序更改为输出。而且您正确的“header\n”工作。谢谢,但是,我认为记录器的默认行为不应该附加到标题,而是将消息记录到下一行。这样做是因为很容易说您想要一个新行,很难说您不想要一个。