有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何减少Java日志模板代码?

每个想要使用java的类。util。日志记录通常需要声明如下日志记录程序:

public class MyClass {
    private static Logger _log = Logger.getLogger(MyClass.class.getName());
}

你如何避免这门课。班getName()样板代码


共 (3) 个答案

  1. # 1 楼答案

    根据您的日志记录需求,您可以创建一个“LoggingService”类,其中包含用于记录到各种“通道”的静态方法。我发现我真的不需要将粒度记录到类级别。你可以给你的伐木工人起个名字,告诉他们什么最适合你。我们已经在大型企业应用程序中使用它好几年了,粒度对我们来说真的不是问题

    日志服务已在静态初始值设定项块中初始化。。。因此,要记录消息:

    记录服务。日志错误(“废话”)

    每个类中都没有样板代码

    下面是一个日志服务示例:

    public class LoggingService {
    
    /**
     * A log for informational messages.
     */
    static private Logger infoLog;
    
    /**
     * A log for data access messages.
     */
    static private Logger dataAccessLog;
    
    /**
     * A log for debug messages.
     */
    static private Logger debugLog;
    
    /**
     * A log for error messages.
     */
    static private Logger errorLog;
    
    /**
     * A log for all XML related messages.
     */
    static private Logger xmlLog;
    
    /**
     * A log for all trace messages.
     */
    static private Logger traceLog;
    
    /**
     * A log for all warning messages.
     */
    static private Logger warnLog;
    
    static {
    
        //This is the bootstrap for the logging service.
        //Setup each logger
        infoLog = Logger.getLogger("com.company.logging.info");
        dataAccessLog = Logger.getLogger("com.company.logging.dataaccess");
        debugLog = Logger.getLogger("com.company.logging.debug");
        errorLog = Logger.getLogger("com.company.logging.error");
        xmlLog = Logger.getLogger("com.company.logging.xml");
        traceLog = Logger.getLogger("com.company.logging.trace");
        warnLog = Logger.getLogger("com.company.logging.warn");
    
        // This must be set so isErrorEnabled() will work.
        errorLog.setLevel(Level.ERROR);
        warnLog.setLevel(Level.WARN);
    }
    static public void logDataAccess(String pMessage) {
        dataAccessLog.info(pMessage);
    }
    
    static public void logInfo(String pMessage) {
        infoLog.info(pMessage);
    }
    
    static public void logDebug(String pMessage) {
        debugLog.debug(pMessage);
    }
    
    static public void logTrace(String pMessage) {
        traceLog.debug(pMessage);
    }
    
    static public void logWarn(String pMessage) {
        warnLog.warn(pMessage);
    }
    
    static public void logError(String pMessage) {
        errorLog.error(pMessage);
    }
    
    static public void logError(String pMessage, Throwable pThrowable) {
        errorLog.error(pMessage, pThrowable);
    }
    
    static public void logXml(String pMessage, XmlBean pContainer) {
    
        if (!xmlLog.isInfoEnabled()) return;
    
        xmlLog.info(pMessage + " : " + JAXBHelper.marshal(pContainer));
    }
    
    static public boolean isInfoEnabled() {
        return infoLog.isInfoEnabled();
    }
    
    static public boolean isDataAccessEnabled() {
        return dataAccessLog.isInfoEnabled();
    }
    
    static public boolean isDebugEnabled() {
        return debugLog.isDebugEnabled();
    }
    
    static public boolean isErrorEnabled() {
        if (errorLog.getLevel().toInt() >= Level.ERROR_INT) {
            return true;
        }
        return false;
    }
    
    static public boolean isTraceEnabled() {
        return traceLog.isDebugEnabled();
    }
    
    static public boolean isXmlEnabled() {
        return xmlLog.isInfoEnabled();
    }
    
    static public boolean isWarnEnabled() {
        return warnLog.isEnabledFor(Level.WARN);
    }
    

    }

  2. # 2 楼答案

    如果您选择包级记录器,在每个包中添加一个样板类,您可以编写:

    private static final Logger log = Logs.log;
    

    有读取调用方类名的黑客(事实上,日志记录实现有检测当前方法的黑客),但我不建议这样做