You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:17:04