我有一個用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);
}
}
我怎樣才能得到的日期格式在等效
log4j
代碼在PatternParser提及。下面是不是在log4j2和什麼是等效的?
AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT
ISO8601DateFormat
AbsoluteTimeDateFormat
DateTimeDateFormat
請幫助。謝謝。
非常感謝.. rgoers。我有一個日期的定製(在記錄之前調整時間戳邏輯)。所以,我需要在java中保持這種轉換。如何在java中獲取日期格式並在追加前格式化日期。 – sridhar
我需要通過「調整時間戳邏輯」來了解你的意思。你的意思是時間戳或其他東西的價值。 Log4j使用Apache Commons Logging中的FastDateFormat副本 - http://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html。那是你不想要的嗎? – rgoers
如果你想實際修改事件時間戳,你可以使用下面提到的Remko方法,或者你可以使用RewritePolicy。這可讓您在LogEvent通過Appender時修改它。 – rgoers