java - 根据状态更改记录器级别

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

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

出于温和的立场,我认为这两种方法是平等的。更严格一点,我想说的是,对于许多 LOGGER 调用,日志消息始终相同(!)的建议方法是纯粹的代码重复。

有什么优点和缺点吗?以“基于意见”结束对我来说也很好,因为这意味着我的“温和”立场也是正确的。

最佳答案

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

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

其实我觉得这更像是问https://codereview.stackexchange.com/的问题

关于java - 根据状态更改记录器级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51708932/

相关文章:

Java - Cipher 自定义提供程序

python - 在使用时间旋转记录器创建的每个日志文件中写入一个标题

C++ 重构 : conditional expansion and block elimination

java - 重构建议和工具

Java枚举泛型

java - BIM服务器错误

java - 调用 executeUpdate 时 UCanAccess/Jackcess 异常禁用我的 Logger 输出

java - 清理重复设置和清理 Java(JDBC) 代码

java - Netbeans 无法识别 JAR 库

python - 使用 dictConfig 的 Python 日志记录问题