Java日志使用如何避免字符拼接及注意事项

😂 这篇文章最后更新于1461天前,您需要注意相关的内容是否还可用。

场景:

String os="macOS";
//不推荐,在不符合该日志级别范围内字符串拼接操作还会执行会影响性能
logger.debug("系统"+os); 
//改写成{}占位符的懒求值方式,建议此操作
logger.debug("系统{}", os);

遇到如下情况又是一次拼接或者是调用一个方法该咋办呢

logger.debug("系统{}", "平台:"+os);
logger.debug("系统{}", toJson(os));

在之前介绍lamada的帖子里(Lamada学习小记)用Lambda延迟加载来避免日志log的字符拼接。借助万能的lamada吧!

logger.debug("系统{}", () -> ("平台:"+os));
logger.debug("系统{}", () -> toJson(os));

把它还原成匿名内部类的形式会发现

logger.info("系统{}",
        new Supplier<Object>() {
            @Override
            public Object get() {
                return ("平台:" + os);
            }
        });

其中java.util.function.Supplier<T> 接口仅包含一个无参的方法: T get() 。用来获取一个泛型参数指定类型的对象数据。由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。