【问题标题】:Java custom logger: logging standards or/and best practicesJava 自定义记录器:记录标准或/和最佳实践
【发布时间】:2023-03-16 02:53:01
【问题描述】:

我正在开发一个框架,我希望 jar 尽可能轻巧且独立。

于是我写了一个日志类:

import java.util.Date;
import java.util.Properties;

public class Logger {

    private static final Logger me = new Logger();
    private static boolean info = false;
    private static boolean debug = false;
    private static boolean error = false;
    private static String className = null;

    public static Logger getInstance(Class<?> clazz) {  
        className = clazz.getCanonicalName();
        try {
            Properties props = new CustProps().load(clazz);
            if(props.get(CustProps.NAME_LOG_MODE) != null) {
                String devMode = props.getProperty(CustProps.NAME_LOG_MODE)
                                   .toLowerCase();
                if("info".equals(devMode)) {
                    info = true;
                    debug = true;
                } else if("debug".equals(devMode)) {
                    debug = true;
                } 
            }
        } catch (Exception e) {
            // debug is error by default
        }

        error = true;
        return me;
    }

    public void logError(Object msg) {
        if(isError()) {
            System.out.println(new Date().toString()
              + " ERROR ["+Logger.className+"] - " + msg);
        }
    }

    public void logDebug(Object msg) {
        if(isDebug()) {
            System.out.println(new Date().toString()
              + " DEBUG ["+Logger.className+"] - " + msg);
        }
    }

    public void logInfo(Object msg) {
        if(isInfo()) {
            System.out.println(new Date().toString()
              + " INFO ["+Logger.className+"] - " + msg);
        }
    }

    public boolean isInfo() { return Logger.info; }

    public boolean isDebug() { return Logger.debug; }

    public boolean isError() { return Logger.error; }

}
  • 什么是使这种日志记录更好的最佳实践?
  • 自己制作记录器值得吗?
  • 使用这个记录器会让我的框架比选择现有的东西(比如log4j)更糟糕吗?

【问题讨论】:

    标签: java logging


    【解决方案1】:

    我强烈建议您使用 slf4j 作为您的日志记录 API,因为它旨在能够在部署时切换后端。换句话说,如果您的日志框架超出了您的要求,或者必须使用其他工具与其他人进行交互,那么您很容易改变主意。

    http://slf4j.org/

    它还允许您使用 {} 构造在日志字符串中轻松插入对象,如果该字符串实际上并没有被记录(这真的很好)。

    我建议您考虑调整“简单”后端以满足您的需求,因为它可能提供您想要的 90%。

    http://www.slf4j.org/apidocs/org/slf4j/impl/SimpleLogger.html

    注意:不要直接使用任何后端(如 log4j 或 java.util.logging),因为它实际上会将您的代码锁定到该后端。使用外观。

    【讨论】:

    • 鉴于诸如 java.util.log* 或 log4j 之类的日志框架具有相当的可扩展性和可配置性,是否真的值得通过外观(诚然是一个非常好的外观)。您是否遇到过 log4j 无法满足的需求?
    • slf4j 提供了 {} 结构。仅此一项就保证在任何地方都可以使用。
    • 感谢您的推荐,但仍然 - 对于 java.util.logging.Logger 我不需要额外的导入。
    • 现在 10 年后,我认为 slf4j(作为 logback 的 API)背后的设计被破坏了,因为日志记录不应该是应用程序的一个不可见部分,而是一个一流的组件。对于一个新项目,我建议查看 log4j 版本 2 并使用本机 API。 logging.apache.org/log4j/2.x
    • 您是否遇到过 log4j 无法满足的需求? 嗯,安全的供应链?
    【解决方案2】:

    你不喜欢 java.util.logging.Logger 吗?它包含在 JDK 中,您不需要其他任何东西。

    【讨论】:

    • 话虽如此(抑制你的热情),Java 日志记录实现了曾经被认为在物理上不可能的事情,因为它同时吸吮和吹气。
    • @Trick,你有没有重新配置 j.u.l 登录的乐趣?
    • @cletus 说了这么多(Seinfield)
    【解决方案3】:

    你问了三个问题:

    • 有哪些最佳实践可以让这种日志记录变得更好?

    正如其他人所指出的,最佳做法是完全替换它,或者用 log4j 或 slf4j 之类的东西,或者为了满足您的“独立”目标,只需使用 java.util.Logger。

    • 制作自己的记录器是否值得?

    不,除非在非常特殊的情况下,由于某种原因,现有框架不能满足您的需求。你没有说这可能是这种情况。

    • 使用这个记录器会让我的框架比选择现有的东西(比如 log4j)更糟糕吗?

    是的,如果没有其他原因,当其他维护人员进入您的代码库时,他们会花几分钟时间阅读您的日志记录类。使用现有框架意味着他们已经知道它的作用。

    【讨论】:

    • 明智的建议。我已经记不清有多少次我看到人们编写自己的框架(通常非常好),但如果要记录它们,他们就会失去兴趣..
    • 很好的答案。但我有一个后续问题。我们的产品有 5 种不同的微服务。我们正在开发一个通用库来处理横切关注点。它可以处理哪些常见的日志记录功能?我想到了几个像:1- 日志模式,2- 日志库活动,3- 通用日志配置。但试图在其中找到更多价值。提前致谢。
    • @MustafaMohammadi 将其作为一个问题提出来,它会得到更多的关注。此外,您需要指定有关该问题的更多信息。我仍然不明白您为什么要开发一个通用的日志库。轮子本身就很好。
    【解决方案4】:

    使用 log4j。它不是一个重量级的日志框架,你说的“尽可能独立”是什么意思?
    只需将 log4j jar 添加到您的框架中即可。

    【讨论】:

      【解决方案5】:

      没有什么比使用java.util.logging.Logger 更轻量级的了,因为它已经在 J​​RE 中可用了。

      【讨论】:

        【解决方案6】:

        为什么要重新发明轮子?

        如果您使用 Java util 日志库,那么它已经在 J​​DK 中,因此您无需提供额外的代码。

        否则,log4j 肯定还不错。

        【讨论】:

          【解决方案7】:

          我同意其他 cmets - 使用 COTS 工具(Logger、Log4j 或其他)。编写和维护自己的(通常)不值得。

          还有一点需要考虑:如果您的框架包含您希望集成到一个日志文件中的其他第 3 方软件,则您必须使用一些共享工具(例如,该第 3 方软件支持的工具)。将系统的所有部分整合到一个位置通常很有帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-20
            • 2018-08-08
            • 1970-01-01
            • 1970-01-01
            • 2011-08-04
            • 1970-01-01
            • 1970-01-01
            • 2010-09-18
            相关资源
            最近更新 更多