如何在log4j2中实现日期模式转换器



我有一个用log4j编写的日期模式转换器。该转换器通过使用PatternParserextractOption()来获取日期格式为String,并将其与不同的log4j日期格式进行比较,并根据确定的日期格式对日期进行格式化。

使用的相关代码如下:

TestPatternParser (log4j):

public class TestPatternParser extends PatternParser {
private static final char DATETIME_CHAR = 'd';
public TestPatternParser(String pattern) {
    super(pattern);
}
@Override
protected void finalizeConverter(char c) {
    switch (c) {
        case DATETIME_CHAR:
            String dateFormatStr = AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT;
            DateFormat df;
            String dOpt = extractOption();
            if (dOpt != null)
                dateFormatStr = dOpt;
            if (dateFormatStr.equalsIgnoreCase(AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT))
                df = new ISO8601DateFormat();
            else if (dateFormatStr.equalsIgnoreCase(AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT))
                df = new AbsoluteTimeDateFormat();
            else if (dateFormatStr.equalsIgnoreCase(AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT))
                df = new DateTimeDateFormat();
            else {
                try {
                    df = new SimpleDateFormat(dateFormatStr);
                } catch (IllegalArgumentException e) {
                    LogLog.error("Could not instantiate SimpleDateFormat with " + dateFormatStr, e);
                    df = (DateFormat) OptionConverter.instantiateByClassName(
                            "org.apache.log4j.helpers.ISO8601DateFormat", DateFormat.class, null);
                }
            }
            PatternConverter pc = new TestDatePatternConverter(formattingInfo, df);
            currentLiteral.setLength(0);
            addConverter(pc);                
            break;
        default:
            super.finalizeConverter(c);
    }
 }
}

TestDatePatternConverter (log4j):

public class TestDatePatternConverter extends PatternConverter {
private DateFormat df;
private Date date;
TestDatePatternConverter(FormattingInfo formattingInfo, DateFormat df) {
    super(formattingInfo);
    date = new Date();
    this.df = df;
}
public String convert(LoggingEvent event) {
    long eventTimestamp = event.timeStamp;
    TestContext testContext;
    if (TestLogHandler.getTimestampDelta() != 0) {
        eventTimestamp = event.timeStamp + 
TestLogHandler.getTimestampDelta();
        } else if (null != (testContext = TestContextHolder.getTestContextForThread())) {
            long timeStamp = testContext.getLogTimeStamp();
            if (timeStamp != 0) {
                eventTimestamp = timeStamp; 
            }
        }
    date.setTime(eventTimestamp);
    String converted = null;
    try {
        converted = df.format(date);
    } catch (Exception ex) {
           LogLog.error("Error occured while converting date.", ex);
} 
   return converted; 
 }
}

我已经写了日期转换器,但如何获得默认日期格式,并与log4j2中的标准日期格式进行比较?

TestDatePatternConverter (log4j2):

@Plugin(name = "TestDatePatternConverter", category = "Converter")
@ConverterKeys({"d"})
public class TestDatePatternConverter extends LogEventPatternConverter {

private Date date;
protected TestDatePatternConverter(String name, String style) {
    super(name, style);
    date = new Date();                 
}
public static TestDatePatternConverter newInstance(final String[] options) {
  return new TestDatePatternConverter("d", "d");
}
@Override
public void format(LogEvent event, StringBuilder toAppendTo) {

long eventTimestamp = event.getTimeMillis();
TestContext testContext;
if (TestLogHandler.getTimestampDelta() != 0) {
    eventTimestamp = event.getTimeMillis() + TestLogHandler.getTimestampDelta();
} else if (null != (testContext = TestContextHolder.getTestContextForThread())) {
    long timeStamp = testContext.getLogTimeStamp();
    if (timeStamp != 0) {
        eventTimestamp = timeStamp; 
    }
}
date.setTime(eventTimestamp);
String converted = null;
try {
??? How can I compare and get the date format as mentioned in the PatternParser in log4j code. ???
    converted = df.format(date);
} catch (Exception ex) {
    StatusLogger.getLogger().error("Error occured while converting date.", ex);
}
toAppendTo.append(converted);

}
}
  1. 如何在等效的log4j代码中获得PatternParser中提到的日期格式

  2. 下面是log4j2中不可用的,等效的是什么?

    AbsoluteTimeDateFormat。ISO8601_DATE_FORMATAbsoluteTimeDateFormat。ABS_TIME_DATE_FORMATAbsoluteTimeDateFormat。DATE_AND_TIME_DATE_FORMAT

    ISO8601DateFormat
    AbsoluteTimeDateFormat
    DateTimeDateFormat

请帮助。谢谢。

不确定您的用例,但是如果您需要调整时间戳以实现某种类型的"时间移位",那么提供一个自定义时钟实现,在系统时间上添加/减去固定数量的毫秒可能是最简单的。您可以通过在系统属性log4j.Clock中指定时钟实现类的完全限定类名来完成此操作。

将其与PatternLayout中预定义的日期格式(如%d{ABSOLUTE}, %d{DEFAULT}等)之一结合将获得最佳性能。

Log4j 2.4做了很多工作来提高日期格式化性能,特别是在多线程场景下(LOG4J2-812, LOG4J2-1097)。如果你能从这些改进中受益,那就太好了。

您看过DatePatternConverter吗?这些选项被传入,然后传递给FixedDateFormat。如果它不是FixedDateFormat知道的标准格式之一,它将尝试使用FastDateFormat.getInstance()创建一个自定义格式。

最新更新