代码之家  ›  专栏  ›  技术社区  ›  Trick

Java自定义记录器:日志记录标准或最佳实践

  •  4
  • Trick  · 技术社区  · 15 年前

    我正在开发一个框架,我不会让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)更糟糕吗?

    7 回复  |  直到 13 年前
        1
  •  11
  •   Dmitry    15 年前

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

        2
  •  20
  •   Thorbjørn Ravn Andersen    13 年前

    我强烈建议您使用slf4j作为日志API,因为它设计为能够在部署时切换后端。换言之,如果您的日志框架发展得太慢,或者必须使用其他东西与其他人进行交互,那么很容易改变主意。

    http://slf4j.org/

    它还允许您使用构造,以便在日志字符串中轻松插入对象,而不需要开销,如果该字符串实际上没有被记录(这真的很好)。

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

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

    注意:不要直接使用任何后端(如Log4J或Java.U.L.Logic),因为它将基本上将代码锁定到该后端。使用正面。

        3
  •  6
  •   CPerkins    15 年前

    你会问三个问题:

    • 什么是使日志记录更好的最佳实践?

    正如其他人所指出的,最佳实践是用log4j或slf4j之类的东西完全替换它,或者仅仅用java.util.logger来实现“独立”目标。

    • 让你自己的伐木工人更值得吗?

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

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

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

        4
  •  3
  •   Alberto Zaccagni    15 年前

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

        5
  •  3
  •   Kaleb Brasee    15 年前

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

        6
  •  2
  •   djna    15 年前

    为什么要重新发明轮子?

    如果使用Java UTIL日志库,那么它已经在JDK中,因此没有额外的代码来提供。

    否则,log4j肯定不错。

        7
  •  0
  •   Armadillo    15 年前

    我同意其他意见-使用COTS工具(logger、log4j或其他)。写作和维护自己的东西(通常)是不值得的。

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