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

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

所以我写了我的日志类:

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.util.logging.Logger吗? 它包含在JDK中,您不需要任何其他内容。

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

http://slf4j.org/

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

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

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

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

你问三个问题:

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

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

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

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

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

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

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

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

为什么重新发明轮子?

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

否则,log4j肯定相当不错。

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

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