假设我们有某种方法发送带有消息状态级别的电子邮件:
void sendEmail(Level level, String message) {
...
}
级别可以分为三种类型:
enum Level {
Info,
Warn,
Error
}
除了发送电子邮件本身之外,我们还希望使用标准记录器记录消息,但我们也希望尊重消息级别,因此对于 Info
级别,我们希望使用 INFO
记录器级别等。
我面临一个观点,我们不应该在 sendEmail
中进行日志记录,因为该方法本身是“通用的”,而在内部它执行“特定行为”:
void sendEmail(Level level, String message) {
switch (level) {
case Info: LOGGER.info("Sending message {}", message); break;
...
}
// other email sending stuff...
}
但是当我们调用此方法时应该在外部记录,例如:
LOGGER.error("Sending message: {}", message);
sendEmail(Level.Error, message);
...
LOGGER.warn("Sending message: {}", message);
sendEmail(Level.Warn, message);
另请注意,级别
不仅用于日志记录,而且还用于电子邮件内容中。还要考虑到该示例非常简单:记录器的实际消息要复杂得多,包含封闭方法的几个其他参数。
出于温和的立场,我认为这两种方法是平等的。更严格一点,我想说的是,对于许多 LOGGER 调用,日志消息始终相同(!)的建议方法是纯粹的代码重复。
有什么优点和缺点吗?以“基于意见”结束对我来说也很好,因为这意味着我的“温和”立场也是正确的。
最佳答案
根据您使用的环境,您可以为 sendMail
方法实现日志记录方面,该方法包装对 sendMail
的所有调用并将消息记录到正确的记录器.
这将解决您的两个代码风格问题,因为它将避免代码重复和关注点分离(保持日志记录和发送邮件分开)。然而,如果这是应用程序中各个方面的唯一用例,那么它会带来额外的复杂性。
其实我觉得这更像是问https://codereview.stackexchange.com/的问题
关于java - 根据状态更改记录器级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51708932/