日志里打出来的都是时间戳?教你一行代码搞定它

关注公众号【1024个为什么】,及时接收最新推送文章!

背景

基于 fastjson 1.x

我们在打日志的时候,习惯把对象用 fastjson 转换成字符串后再交给日志打印。

像下面这样:

293323f4ec392b5837e9375a529e6353.png

但等我们需要通过日志里的日期排查问题时就傻眼了,看到的日志是这个样子的:

749fb29eb569394046af246a9e61eca4.png

看到都是时间戳,还得拷出来找个时间戳转换工具才能知道真实的时间。

看到这里是不是突然意识到这确实是个痛点啊,只是平时也没多想凑合看了。

那么怎么才能把 Date 类型的数据,自动序列化成人类一眼就能看懂的年月日呢?

看看常见方案

1、使用 @JSONField

像这样

5ac54e2f9327f4f3662201c8ccbd472a.png

如果只有几个类,这么写一下还行,如果想要日志里再也看不到时间戳,那得把整个工程里都加上这个注解,不可行。

2、使用 WriteDateUseDateFormat

public static String toJSONString(Object object, SerializerFeature... features) {
        return toJSONString(object, DEFAULT_GENERATE_FEATURE, features);
    }
JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat)

这个方案的好处是不用在属性上加 @JSONField 注解了,在需要打日志的地方使用这个方法序列化就可以。

缺点:所有打日志的地方都要考虑使用哪个序列化方法

3、使用 SerializeConfig

SerializeConfig config = new SerializeConfig();
config.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
System.out.println(JSON.toJSONString(bill, config));

这个和方案 2 类似,缺点也一样,不多说了。

4、使用 FastJsonConfig(不适用打日志的场景)

这个方案需要依赖 SpringMVC ,具体就是下面的这个方法:

beacba5e07aaa6332cd35d87c3696807.png

原理是提供一个 HttpMessageConverter,在这个 converter 中设置 fastjson 序列化的格式。

@Configuration
public class FastJsonConverterConfig {


    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteNullBooleanAsFalse
                SerializerFeature.WriteDateUseDateFormat
        );
        fastConverter.setFastJsonConfig(fastJsonConfig);


     //全局指定了日期格式
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");


        HttpMessageConverter<?> converter = fastConverter;
        return new HttpMessageConverters(converter);
    }
}

不知为什么,从网上搜 “fastjson全局日期格式化解决方案” 时,搜到的都是这个方案,就粘过来一段代码,看着很高大上,但是和我的期望相差很远。

这个方案限制太多,需要依赖 Spring,而且主要用于和前端页面数据交互时的处理。

终极方案

灵感还是源自上面的方案 3,研究了 SerializeConfig 的源码后发现其内部自带一个全局的实例,而且还是 public 的,正好可以为我所用。

只需一行代码(可以在项目启动时设置上

SerializeConfig.getGlobalInstance().put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));

通过这行代码就可以全局设置 Date 类型的属性序列化的格式了。

以后打日志还像原来直接使用 JSON.toJSONString(Object object)  就可以。

看看效果

8f6b3ff9c4d466c04b630c71aa8b24ea.png

注意 !!!

终极方案是全局的设置,会影响所有的 JSON 序列化,需要评估自己项目中 fastjson 的使用场景是否受影响。

反正我经手的项目没看到过什么高级的用法,

要么是 JSON.toJSONString(Object object),

要么是 JSONObject.parseObject(String text, Class clazz )。

扯两句

打能看得懂的日志

好体验始于小细节

原创不易,多多关注,一键三连,感谢支持!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值