Java自定义记录器:记录标准或/和最佳实践

Tri*_*ick 4 java logging

我正在开发一个框架,我不会尽可能轻量级和独立.

所以我写了我的日志记录类:

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

}
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*sen 21

我强烈建议您使用slf4j作为日志API,因为它旨在能够在部署时切换后端.换句话说,如果你曾经不再使用自己的日志框架,或者必须使用其他东西与其他人交互,那么改变主意很容易.

http://slf4j.org/

它还允许您使用{} -construction轻松地在日志字符串中插入对象而不会产生开销,如果该字符串实际上并未实际记录(这非常好).

我建议你考虑根据你的需要调整"简单"后端,因为它可能提供你想要的90%.

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

注意:不要直接使用任何后端(如log4j或java.util.logging),因为它基本上会将代码锁定到该后端.使用立面.


Dmi*_*try 11

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

  • 话虽如此(遏制你的热情),Java loggings实现了曾经被认为是物理上不可能的东西,因为它同时又糟透了. (3认同)

CPe*_*ins 7

你问三个问题:

  • 使这种日志记录更好的最佳做法是什么?

正如其他人所指出的那样,最好的做法是用log4j或slf4j之类的东西完全替换它,或者用java.util.Logger来满足你的"独立性"目标.

  • 让自己的记录器值得吗?

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

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

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