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

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

另外就是格式问题,楼主目前的格式只考虑给人看没考虑给机器解析,可以考虑调整一下,加一些特殊的分隔符,便于统一处理日志做数据分析和预警之类的
cslive
2023-10-25 08:35:07 +08:00
使用 slf4j, log.info("Request to {} failed,uuid is {}",uri,uuid)
自带占位符
N9f8Pmek6m8iRWYe
2023-10-25 08:54:55 +08:00
竟无语凝噎
tramm
2023-10-25 09:26:08 +08:00
楼主从 C 那边转过来的?
ZhanLangCN
2023-10-25 09:36:56 +08:00
uuid 如果是追踪调用链用的话可以存在 MDC, 那日志直接就
ZhanLangCN
2023-10-25 09:37:11 +08:00
log.error("Request to {} failed.", uri, exception)
workingonescape
2023-10-25 09:38:18 +08:00
绷不住了
qcbf111
2023-10-25 09:39:52 +08:00
log.error($"Request to {uri} failed, uuid is {uuid}.", exception)
c#真的是越用越先进!
tedzhou1221
2023-10-25 09:41:00 +08:00
```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
2023-10-25 09:43:17 +08:00
log.error(() -> String.format("Request to %s failed, uuid is %s.", uri, uuid), exception);
chatgpt 回答的
zhongjun96
2023-10-25 09:52:36 +08:00
请求入口设置 uuid 到 MDC ,logback 配置好,该请求所有日志都会带上 uuid 。更方便排查。
iold
2023-10-25 09:55:44 +08:00
不怎么写 Java ,但是 idea 会提示你这写法可以优化吧??
litchinn
2023-10-25 10:02:38 +08:00
/t/984299
前两天不是就有帖子讨论过了吗,这个帖子还能回答为啥不能像你这样写
chendy
2023-10-25 10:03:18 +08:00
@iold 这种警告基本要 sonar lint 这种才会有,idea 本身没管到这一层
tedzhou1221
2023-10-25 10:03:25 +08:00
@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
2023-10-25 10:13:54 +08:00
是来钓鱼的吗。。。
kaedei
2023-10-25 10:23:13 +08:00
@qcbf111 c#也不要这么写,每一次调用都会有额外的字符串分配。把前面$去掉,log 框架会帮你格式化的
log.error(exception, "Request to {uri} failed, uuid is {uuid}.", uri, uuid);
bk201
2023-10-25 10:25:29 +08:00
%s 这个看了就头疼,不知道当初谁设计的这 api 写法

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

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

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

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

© 2021 V2EX