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 没有您描述的那样的内置功能...所以,恕我直言,您最好的选择是:

  1. 利用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()).

  2. 定义您自己的 Appender(或 PatternLayout),为您包含(和隐藏)消息序列生成器逻辑。我相信这是最难但最好的选择,因为您在 logj4 组件中封装了序列的逻辑,并且您不需要在任何地方修改代码...

注意,无论您实施何种解决方案,请记住以某种方式保留序列...否则,当您的应用程序再次启动时,消息计数也将在 "one" 重新开始...

更新: 检查 log4j 文档,我发现了这个:log4j layouts ... 在 Patterns[ 寻找 sequenceNumber =34=] 部分...也许这可以帮助你....