2015-10-08 27 views
0

我有一個用log4j編寫的日期模式轉換器。此轉換器使用extractOption()的將dateformat作爲字符串獲取dateformat,並將其與log4j dateformats進行比較,並根據標識的日期格式對日期進行格式化。如何在log4j2中實現日期模式轉換器

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; 
} 
} 

我已經寫的時間轉換器

使用的相關碼下面提到但如何獲得默認日期格式並與標準日期f進行比較ormats in 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_FORMAT AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT

    ISO8601DateFormat
    AbsoluteTimeDateFormat
    DateTimeDateFormat

請幫助。謝謝。

回答

0

你看過DatePatternConverter了嗎?這些選項被傳入,然後傳遞給FixedDateFormat。如果它不是FixedDateFormat知道的標準格式之一,它將嘗試使用FastDateFormat.getInstance()創建自定義格式。

+0

非常感謝.. rgoers。我有一個日期的定製(在記錄之前調整時間戳邏輯)。所以,我需要在java中保持這種轉換。如何在java中獲取日期格式並在追加前格式化日期。 – sridhar

+0

我需要通過「調整時間戳邏輯」來了解你的意思。你的意思是時間戳或其他東西的價值。 Log4j使用Apache Commons Logging中的FastDateFormat副本 - http://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html。那是你不想要的嗎? – rgoers

+0

如果你想實際修改事件時間戳,你可以使用下面提到的Remko方法,或者你可以使用RewritePolicy。這可讓您在LogEvent通過Appender時修改它。 – rgoers

1

不確定您的使用情況,但如果您需要調整時間戳以實現某種「時間偏移」,則最簡單的方法是提供自定義的Clock實現,該實現可以增加/減少固定的毫秒數到系統時間。您可以通過在系統屬性log4j.Clock中指定Clock實現類的完全限定類名稱來完成此操作。

將PatternLayout與預先定義的日期格式(如%d{ABSOLUTE},%d{DEFAULT}等)結合使用可以獲得最佳性能。

Log4j 2.4在提高日期格式化性能方面做了很多工作,特別是在多線程場景(LOG4J2-812LOG4J2-1097)中。如果你能從這些改進中受益,那將是一件好事。