请问这条 Java 日志有更优雅的写法吗? log.error(String.format("Request to %s failed, uuid is %s.",uri, uuid),exception)

197 天前
 BraveXaiver
谢谢
2487 次点击
所在节点    Java
28 条回复
stranchong
197 天前
log.error("Request to {} failed, uuid is {}.", uri, uuid, exception)
==========
这样异常堆栈也能打印出来
iminto
197 天前
楼主写法给我看笑了。。。log 本来就有格式化功能,再格式化一次。。
chendy
197 天前
其实如果是 100% 会打印出来的 log ,就不需要 format 了,直接 + 拼接就行
想优雅点就按照经验先 new 一个长度差不多够用的 StringBuilder 避免扩容
再优雅点就把这个 StringBuilder 扔 ThreadLocal 里缓存住(不一定有性能提升,可能 ThreadLocal 查找的时间都够把字符串拼出来了

另外就是格式问题,楼主目前的格式只考虑给人看没考虑给机器解析,可以考虑调整一下,加一些特殊的分隔符,便于统一处理日志做数据分析和预警之类的
cslive
197 天前
使用 slf4j, log.info("Request to {} failed,uuid is {}",uri,uuid)
自带占位符
N9f8Pmek6m8iRWYe
197 天前
竟无语凝噎
tramm
197 天前
楼主从 C 那边转过来的?
ZhanLangCN
197 天前
uuid 如果是追踪调用链用的话可以存在 MDC, 那日志直接就
ZhanLangCN
197 天前
log.error("Request to {} failed.", uri, exception)
workingonescape
197 天前
绷不住了
qcbf111
197 天前
log.error($"Request to {uri} failed, uuid is {uuid}.", exception)
c#真的是越用越先进!
tedzhou1221
197 天前
```java
public StringFormattedMessage(final Locale locale, final String messagePattern, final Object... arguments) {
this.locale = locale;
this.messagePattern = messagePattern;
this.argArray = arguments;
if (arguments != null && arguments.length > 0 && arguments[arguments.length - 1] instanceof Throwable) {
this.throwable = (Throwable) arguments[arguments.length - 1];
}
}
```
log4j 的 log.error 的实现中,找到 StringFormattedMessage 类,会判断最后一个是不是 Throwable 。

所以调用
这个接口也是可以打印异常堆栈
public void error(String format, Object... arguments);

调用这个也行
public void error(String msg, Throwable t);
liaopen123
197 天前
log.error(() -> String.format("Request to %s failed, uuid is %s.", uri, uuid), exception);
chatgpt 回答的
zhongjun96
197 天前
请求入口设置 uuid 到 MDC ,logback 配置好,该请求所有日志都会带上 uuid 。更方便排查。
iold
197 天前
不怎么写 Java ,但是 idea 会提示你这写法可以优化吧??
litchinn
197 天前
/t/984299
前两天不是就有帖子讨论过了吗,这个帖子还能回答为啥不能像你这样写
chendy
197 天前
@iold 这种警告基本要 sonar lint 这种才会有,idea 本身没管到这一层
tedzhou1221
197 天前
@iold #14
我使用的 idea 2023.2.2 版本,没有这种提示。

楼主的问题主要是:(个人猜测)
看到 error 接口,以为只有这个才会打印异常堆栈, public void error(String msg, Throwable t);

以为这个接口 public void error(String format, Object... arguments);

没有 Throwable 作为入参,认为不会打印异常堆栈。


包括我以前也是这样认为。同样很多年前也遇到过 log.error 不打印异常堆栈的情况。
gongxuanzhang
197 天前
是来钓鱼的吗。。。
kaedei
197 天前
@qcbf111 c#也不要这么写,每一次调用都会有额外的字符串分配。把前面$去掉,log 框架会帮你格式化的
log.error(exception, "Request to {uri} failed, uuid is {uuid}.", uri, uuid);
bk201
197 天前
%s 这个看了就头疼,不知道当初谁设计的这 api 写法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/985087

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX