我有一个方法要添加特定的日志记录:
@Slf4j
@Service
public class SomethingService {
public void doSomething(Something data, String comment, Integer limit) {
Long id = saveSomethingToDatabase(data, comment);
boolean sentNotification = doSomething(id);
// ...
// Log what you done.
// Variables that always have important data: data.getName(), id
// Variables that are optional: sentNotification, comment, limit
// (optional means they aren't mandatory, rarely contains essential data, often null, false or empty string).
}
}
我可以简单地记录所有:
log.info("Done something '{}' and saved (id {}, sentNotification={}) with comment '{}' and limit {}",
something.getName(), id, sentNotification, comment, limit);
// Done something 'Name of data' and saved (id 23, sentNotification=true) with comment 'Comment about something' and limit 2
但大多数时候,大多数参数都是无关的。通过以上步骤,我得到如下日志:
// Done something 'Name of data' and saved (id 23, sentNotification=false) with comment 'null' and limit null
这使得日志很难阅读,很长,而且不必要的复杂(在大多数情况下,其他参数不存在)。
我想处理所有的案件,只保留必要的数据。示例:
// Done something 'Name of data' and saved (id 23)
// Done something 'Name of data' and saved (id 23) with comment 'Comment about something'
// Done something 'Name of data' and saved (id 23) with limit 2
// Done something 'Name of data' and saved (id 23) with comment 'Comment about something' and limit 2
// Done something 'Name of data' and saved (id 23, sent notification)
// Done something 'Name of data' and saved (id 23, sent notification) with limit 2
// Done something 'Name of data' and saved (id 23, sent notification) with comment 'Comment about something'
// Done something 'Name of data' and saved (id 23, sent notification) with comment 'Comment about something' and limit 2
我可以手工编码:
String notificationMessage = sentNotification ? ", sent notification" : "";
String commentMessage = comment != null ? String.format(" with comment '%s'", comment) : "";
String limitMessage = "";
if (limit != null) {
limitMessage = String.format("limit %s", limit);
limitMessage = comment != null ? String.format(" and %s", limitMessage) : String.format(" with %s", limitMessage);
}
log.info("Done something '{}' and saved (id {}{}){}{}",
something.getName(), id, notificationMessage, commentMessage, limitMessage);
但是它很难写,很难读,很复杂而且会导致错误。
我想指定一部分日志。
伪代码示例:
log.info("Done something '{}' and saved (id {} $notification) $parameters",
something.getName(), id,
$notification: sentNotification ? "sent notification" : "",
$parameters: [comment, limit]);
它应该支持可选参数,用给定字符串替换布尔/条件,支持分隔空格、逗号和单词 with
以及 and
.
可能有这个图书馆吗?或者至少有一种更简单的方法来编码这个?
如果不是这样,我就没有别的事情可以写我自己的库来记录消息了。此外,这种库将提供所有日志的一致性。
如果您没有看到三个可选参数的问题,只需想象一下还有更多的参数(并且您不能总是将它们打包到一个类中—另一个仅用于参数日志记录的类层会导致更多的复杂性)。
最后,我知道我可以分别记录每个动作。但有了这个,我会得到更多的日志,我不会在一个地方有最重要的信息。其他日志在 debug
水平,不是 info
.
暂无答案!
目前还没有任何答案,快来回答吧!