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

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

背景

基于 fastjson 1.x

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

像下面这样:

293323f4ec392b5837e9375a529e6353.png

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

日志里打出来的都是时间戳?教你一行代码搞定它_第1张图片

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

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

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

看看常见方案

1、使用 @JSONField

像这样

日志里打出来的都是时间戳?教你一行代码搞定它_第2张图片

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

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 ,具体就是下面的这个方法:

日志里打出来的都是时间戳?教你一行代码搞定它_第3张图片

原理是提供一个 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 )。

扯两句

打能看得懂的日志

好体验始于小细节

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

你可能感兴趣的:(java,json,javascript,大数据,html)