Log4j2 计数消息
Log4j2 count messages
我想统计我的消息数。所以日志消息应该是这样的:
000001:Test:Service:23-05-2016:20-26-01:Message
000002:Test:Service:23-05-2016:20-26-01:Message
000003:Test:Service:23-05-2016:20-26-01:Message
我使用以下 log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<File name="logFile" filename="${sys:logDir}${sys:logFilename}">
<PatternLayout pattern="${sys:logLevel}:Service:%d{dd-MM-yyyy:HH-mm-ss}:%msg%n" />
</File>
</Appenders>
<Loggers>
<Root level="${sys:logLvl}">
<AppenderRef ref="logFile" />
</Root>
</Loggers>
</Configuration>
我找不到任何东西。只有关于 %i 的内容用于新日志文件的翻转。我希望有人能帮助我!
此致
编辑:
我可以解决问题。感谢 Carlitos Way 和 rgoers:
我的新 class SequenceNumberPatternConverterPaddedWithZeros:
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import java.util.concurrent.atomic.AtomicLong;
@Plugin(
name = "SequenceNumberPaddedPatternConverter",
category = "Converter"
)
@ConverterKeys({"snp", "sequenceNumberPadded"})
public final class SequenceNumberPatternConverterPaddedWithZeros extends LogEventPatternConverter {
private String zeros;
private static final AtomicLong SEQUENCE = new AtomicLong();
private SequenceNumberPatternConverterPaddedWithZeros(String zeros) {
super("Sequence Number Padded", "snp");
this.zeros = zeros;
}
public static SequenceNumberPatternConverterPaddedWithZeros newInstance(String[] options) {
if(options.length > 1 ||!StringUtils.isNumeric(options[0])) {
LOGGER.error("Incorrect option on SequenceNumberPatternConverterPadded. Expected a number, received " + options.length);
return null;
}
return new SequenceNumberPatternConverterPaddedWithZeros(options[0]);//INSTANCE;
}
public void format(LogEvent event, StringBuilder toAppendTo) {
toAppendTo.append(String.format("%0"+this.zeros+"d",SEQUENCE.incrementAndGet()));
}
}
所以现在你可以像这样使用它了:
<PatternLayout pattern="%snp{6}:${sys:logLevel}:Service:%d{dd-MM-yyyy:HH-mm-ss}:%msg%n"/>
000010:Test:Service:24-05-2016:11-06-52:message
我认为 log4j 没有您描述的那样的内置功能...所以,恕我直言,您最好的选择是:
利用log4j内置的MDC特性,通过JAVA代码生成自己的消息序列(序列生成器必须实现为synchronized singleton)...稍后,您应该将模式重新配置为:%X{seqNextVal}${sys:logLevel}:Service:%d{dd-MM-yyyy:HH-mm-ss}:%msg%n"
其中 seqNextVal
配置的消息序列(示例:MDC.put(seqNextVal, MessageSequenceGen.nextValue())
.
定义您自己的 Appender(或 PatternLayout),为您包含(和隐藏)消息序列生成器逻辑。我相信这是最难但最好的选择,因为您在 logj4 组件中封装了序列的逻辑,并且您不需要在任何地方修改代码...
注意,无论您实施何种解决方案,请记住以某种方式保留序列...否则,当您的应用程序再次启动时,消息计数也将在 "one" 重新开始...
更新: 检查 log4j 文档,我发现了这个:log4j layouts ... 在 Patterns[ 寻找 sequenceNumber
=34=] 部分...也许这可以帮助你....
我想统计我的消息数。所以日志消息应该是这样的:
000001:Test:Service:23-05-2016:20-26-01:Message
000002:Test:Service:23-05-2016:20-26-01:Message
000003:Test:Service:23-05-2016:20-26-01:Message
我使用以下 log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<Appenders>
<File name="logFile" filename="${sys:logDir}${sys:logFilename}">
<PatternLayout pattern="${sys:logLevel}:Service:%d{dd-MM-yyyy:HH-mm-ss}:%msg%n" />
</File>
</Appenders>
<Loggers>
<Root level="${sys:logLvl}">
<AppenderRef ref="logFile" />
</Root>
</Loggers>
</Configuration>
我找不到任何东西。只有关于 %i 的内容用于新日志文件的翻转。我希望有人能帮助我!
此致
编辑:
我可以解决问题。感谢 Carlitos Way 和 rgoers:
我的新 class SequenceNumberPatternConverterPaddedWithZeros:
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
import java.util.concurrent.atomic.AtomicLong;
@Plugin(
name = "SequenceNumberPaddedPatternConverter",
category = "Converter"
)
@ConverterKeys({"snp", "sequenceNumberPadded"})
public final class SequenceNumberPatternConverterPaddedWithZeros extends LogEventPatternConverter {
private String zeros;
private static final AtomicLong SEQUENCE = new AtomicLong();
private SequenceNumberPatternConverterPaddedWithZeros(String zeros) {
super("Sequence Number Padded", "snp");
this.zeros = zeros;
}
public static SequenceNumberPatternConverterPaddedWithZeros newInstance(String[] options) {
if(options.length > 1 ||!StringUtils.isNumeric(options[0])) {
LOGGER.error("Incorrect option on SequenceNumberPatternConverterPadded. Expected a number, received " + options.length);
return null;
}
return new SequenceNumberPatternConverterPaddedWithZeros(options[0]);//INSTANCE;
}
public void format(LogEvent event, StringBuilder toAppendTo) {
toAppendTo.append(String.format("%0"+this.zeros+"d",SEQUENCE.incrementAndGet()));
}
}
所以现在你可以像这样使用它了:
<PatternLayout pattern="%snp{6}:${sys:logLevel}:Service:%d{dd-MM-yyyy:HH-mm-ss}:%msg%n"/>
000010:Test:Service:24-05-2016:11-06-52:message
我认为 log4j 没有您描述的那样的内置功能...所以,恕我直言,您最好的选择是:
利用log4j内置的MDC特性,通过JAVA代码生成自己的消息序列(序列生成器必须实现为synchronized singleton)...稍后,您应该将模式重新配置为:
%X{seqNextVal}${sys:logLevel}:Service:%d{dd-MM-yyyy:HH-mm-ss}:%msg%n"
其中seqNextVal
配置的消息序列(示例:MDC.put(seqNextVal, MessageSequenceGen.nextValue())
.定义您自己的 Appender(或 PatternLayout),为您包含(和隐藏)消息序列生成器逻辑。我相信这是最难但最好的选择,因为您在 logj4 组件中封装了序列的逻辑,并且您不需要在任何地方修改代码...
注意,无论您实施何种解决方案,请记住以某种方式保留序列...否则,当您的应用程序再次启动时,消息计数也将在 "one" 重新开始...
更新: 检查 log4j 文档,我发现了这个:log4j layouts ... 在 Patterns[ 寻找 sequenceNumber
=34=] 部分...也许这可以帮助你....