Log4j中字符串拼接性能优化:为何推荐用{}替代字符串拼接?
日志记录最佳实践:为啥要弃用字符串拼接改用占位符?
你肯定在日志规范里听过这条:别用字符串拼接来组装日志消息,改用{}占位符!我之前特意去研究了Log4j的源码,发现它内部处理日志格式化的逻辑,刚好对应了这个最佳实践。
比如它有个format()方法,专门负责把模式和参数组合成最终的日志消息,源码片段是这样的:
/** * 使用类SLF4J的格式化器格式化参数。 * @param pattern 模式,可能格式有误。 * @param arguments 参数。 * @return 格式化后的日志消息 */ public String format(String pattern, Object... arguments) { // 内部调用SLF4J的格式化逻辑,仅在需要输出日志时才完成参数替换 return MessageFormatter.arrayFormat(pattern, arguments).getMessage(); }
为啥这种方式比字符串拼接好?核心原因在于性能优化:如果当前日志级别没开启(比如你设置了INFO级别,但代码里打了DEBUG日志),用字符串拼接的话,拼接操作还是会执行完,白白浪费CPU和内存;但用占位符的话,只有当日志确实要被输出的时候,才会执行参数替换的格式化操作,避免了无用的性能消耗。
而且这种写法也更简洁易读,不用写一堆+号拼接字符串,后续维护起来也更省心。
内容的提问来源于stack exchange,提问作者ninja.coder
相关产品推荐
相关产品推荐

