根据状态更改记录器级别

时间:2018-08-06 13:35:27

标签: java logging refactoring slf4j

比方说,我们有一些方法可以发送状态为电子邮件的电子邮件:

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);

还请注意,level不仅用于记录日志,而且还用于电子邮件内容中。还应考虑到该示例非常简化:记录器的实际消息要复杂得多,其中包含封闭方法的其他几个参数。

处于温和的姿势,我认为两种方法都一样。更加严格一点,我想说,建议的方法是在日志消息始终相同的情况下进行许多LOGGER调用,这是纯代码重复。

任何利弊?以“基于观点”结束对我也很好,因为这意味着我的“温和”立场也是正确的。

1 个答案:

答案 0 :(得分:1)

根据您使用的环境,您可以为sendMail方法实现日志记录方面,该方法将对sendMail的所有调用包装并将消息记录到正确的记录器中。

这将解决您的两个代码风格问题,因为它将避免代码重复和关注点分离(保持日志记录和单独发送邮件)。但是,如果这是您应用程序中各个方面的唯一用例,则会带来更高的复杂性。

实际上,我认为这更像是https://codereview.stackexchange.com/的问题