Log4j配置JSON日志纳秒时间格式报错问题求助
解决Log4j2 JsonLayout纳秒级时间戳配置问题
嘿,我刚好碰到过类似的问题,你这是踩了Log4j2日期格式的小坑啦!报错里说的Illegal pattern character 'n',是因为默认情况下Log4j2用的是Java旧版的SimpleDateFormat来处理日期,这个类根本不认识n作为纳秒的格式符——它只认S表示毫秒,最多只能输出三位。要输出纳秒级时间戳,得换个正确的姿势来配置:
方法一:用Java 8的日期格式化规则(推荐,需Log4j2 2.11.0+)
从Log4j2 2.11.0版本开始,官方支持了Java 8的DateTimeFormatter,这个类是支持n表示纳秒的。你只需要在date转换器里明确指定使用这个格式化器就行:
<JsonLayout compact="true" properties="true" eventEol="true" > <KeyValuePair key="timestamp" value="$${date:format=java.time.format.DateTimeFormatter:pattern=HH:mm:ss.nnnnnnnnn}" /> </JsonLayout>
嫌上面的写法长?也可以把格式器放在后面,效果是一样的:
<JsonLayout compact="true" properties="true" eventEol="true" > <KeyValuePair key="timestamp" value="$${date:HH:mm:ss.nnnnnnnnn:format=java.time.format.DateTimeFormatter}" /> </JsonLayout>
方法二:直接拿日志事件的纳秒时间戳(更高效)
其实Log4j2的每一条日志事件本身就带着纳秒级的时间戳(是从1970年元旦零点开始的纳秒数),你完全可以不用格式化字符串,直接引用这个值:
<JsonLayout compact="true" properties="true" eventEol="true" > <KeyValuePair key="timestamp_nanos" value="$${event:timestamp}" /> </JsonLayout>
如果只是需要数字形式的纳秒时间戳,这个方法比格式化字符串高效多了。
对了,要是你还要给普通的.log文本文件配置纳秒时间戳,同样可以用上面的规则,比如在PatternLayout里这么写:
<PatternLayout pattern="%d{HH:mm:ss.nnnnnnnnn:format=java.time.format.DateTimeFormatter} %level %logger - %msg%n" />
最后提醒下,一定要确保你的Log4j2版本在2.11.0及以上,不然Java 8的日期格式化支持可能用不了哦!
内容的提问来源于stack exchange,提问作者Tatiana Goretskaya
相关产品推荐
相关产品推荐

