1.背景
使用MessageFormat.format
格式化来记录日志,操作
例如如下代码:
log.error(MessageFormat.format("Bilibili回调参数缺失,channel:{0},param:{1},detail:{2}", channel, param, detail));
通过占位符将 channel, param, detail赋值给{0},{1},{2},避免使用%s做占位符
[10:19:42.958] ERROR [xxx] Bilibili回调参数缺失,channel:xxx,param:xxx,detail:xxx
2.问题
当在格式化中包含Long类型时,会出现,
号分割现象
public static void main(String[] args) {
long currentTime = System.currentTimeMillis();
log.info(MessageFormat.format("Current Time {0}", currentTime));
}
3.原因分析
-
格式化输出:
当MessageFormat格式化数字时,默认情况下会根据当前的默认区域设置(locale)来决定是否添加千分位分隔符。
如果当前的默认区域设置是美国英语(en_US),那么MessageFormat会自动在输出的数字中添加千分位逗号。 -
区域设置的影响:
Java中的Locale类定义了语言环境的具体设置,包括语言、国家和地区等信息。
不同的Locale可能有不同的数字格式化规则,例如是否使用千分位分隔符以及使用的分隔符是什么。
4.解决办法
- 最简单的方法是先将long转换成String类型,再格式化
- 使用
DecimalFormat df = new DecimalFormat("#");
"#"
:表示只显示数字,不强制显示小数点后的 0。例如,如果你将12345
传递给这个DecimalFormat
对象,它会格式化为 “12345”。
public static void main(String[] args) {
long currentTime = System.currentTimeMillis();
DecimalFormat df = new DecimalFormat("#");
String formatted = df.format(currentTime);
log.info(MessageFormat.format("Current Time {0}", currentTime));
log.info(MessageFormat.format("Current Time {0}", String.valueOf(currentTime)));
log.info(MessageFormat.format("Current Time {0}", formatted));
}