Apache Log4j使用特定时区进行日志记录

我希望日志应包含特定时区的日期条目。 有没有办法在log4j.properties中强制时区?

现在我正在使用JDK 1.5,因为您已经知道JDK 1.5中存在时区错误,该错误在JDK 1.5中被删除。 对于JDK 1.5,默认情况下显示“GMT”时区。 我想在Log4j中配置我的特定时区。

这将允许您在日志的每一行中查看时区信息:

 %d{yyyy-MM-dd/HH:mm:ss.SSS/zzz} 

诀窍是在模式中包含’zzz’,因为根据Javadoc for java.text.SimpleDateFormat( http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html ) ,这是时区的代码。 Log4J使用与SimpleDateFormat相同的规则。

Log4J Javadoc中有更多细节:

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

查找表中“转换字符”为字母“d”的行。

最好的方法是使用Apache Extras™for Apache log4j™并使用org.apache.log4j.EnhancedPatternLayout替换正常的PatternLayout,如果使用属性文件则执行以下操作:

 //log4j.appender.xxx.layout = org.apache.log4j.PatternLayout //Replaced by log4j.appender.xxx.layout = org.apache.log4j.EnhancedPatternLayout 

然后,您可以在ConversionPattern中使用%d {ISO8601} {GMT}代替%d,以GMT格式显示您的日期。 可以指定任何时区而不是GMT

使用org.apache.log4j.helpers.DateLayout作为布局类,并使用属性timeZone

在您的ConversionPattern包含date参数。 从PatternLayout文档:

日期

用于在本地时区输出日志记录事件的日期。 要以通用时间输出日期,请使用%utcdate模式。 日期转换说明符后面可能跟在大括号之间的日期格式说明符。 例如, %date{HH:mm:ss,fff}%date{dd MMM yyyy HH:mm:ss,fff} 。 如果没有给出日期格式说明符,则假定为ISO8601格式( Iso8601DateFormatter )。

日期格式说明符允许使用与ToString的时间模式字符串相同的语法。

为获得更好的结果,建议使用log4net日期格式化程序。 这些可以使用字符串“ABSOLUTE”,“DATE”和“ISO8601”中的一个来指定,用于指定AbsoluteTimeDateFormatterDateTimeDateFormatterIso8601DateFormatter 。 例如, %date{ISO8601}%date{ABSOLUTE}

这些专用日期格式化程序的性能明显优于ToString

您可以添加以下行

 log4j.appender.S.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss zzz}{GMT} %-5p [%t][%c:%M(%L)] %m%n 

这有三个步骤:

1)在这里添加log4j-extras依赖项

2)将布局设置为EnhancedPatternLayout: log4j.appender.stdout.layout=org.apache.log4j.EnhancedPatternLayout (将stdout更改为您正在使用的任何appender)

3)在日期时间模式后添加你的时区log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}{IST} %-5p %c{1}:%L - %m%n (在我的情况下,这里是IST)

您可以在此处或此处参考 java中可用的时区ID列表