我正在使用 Java 和 XPage 开发网络爬虫。我在 SLF4J、Log4J、java.util.logging 等日志库与 Lotus Notes 之间遇到了很多兼容性问题。
因此,我开发了自己的非常简单的记录器类。
import java.io.PrintWriter;
import java.util.Calendar;
import org.apache.commons.lang3.exception.ExceptionUtils;
public class Logger {
private static final Calendar calendar = Calendar.getInstance();
public enum Level {NONE, ERROR, WARNING, INFO, DEBUG, TRACE}
private Level level = Level.NONE;
private PrintWriter stream = null;
public void setLevel(Level l) {
level = l;
}
public void setPrintWriter(PrintWriter f) {
stream = f;
}
public void error(String m) {
if (Level.ERROR.compareTo(level) <= 0) {
format("ERROR", m);
}
}
public void error(String m, Throwable e) {
if (Level.ERROR.compareTo(level) <= 0) {
StringBuilder sb = new StringBuilder(1024);
sb.append(m);
sb.append(ExceptionUtils.getStackTrace(e));
format("ERROR", sb.toString());
}
}
public void warn(String m) {
if (Level.WARNING.compareTo(level) <= 0) {
format("WARNING", m);
}
}
public void warn(String m, Throwable e) {
if (Level.WARNING.compareTo(level) <= 0) {
StringBuilder sb = new StringBuilder(1024);
sb.append(m);
sb.append(ExceptionUtils.getStackTrace(e));
format("WARNING", sb.toString());
}
}
public void debug(String m) {
if (Level.DEBUG.compareTo(level) <= 0) {
format("DEBUG", m);
}
}
public void info(String m) {
if (Level.INFO.compareTo(level) <= 0) {
format("INFO", m);
}
}
public void trace(String m) {
if (Level.TRACE.compareTo(level) <= 0) {
format("TRACE", m);
}
}
public void format(String type, String m) {
StringBuilder sb = new StringBuilder(1024);
sb.append("[");
sb.append(type);
sb.append("] ");
sb.append(calendar.getTime().toString());
sb.append(" - ");
sb.append(m);
String line = sb.toString();
System.out.println(line);
if (stream != null) {
stream.println(line);
stream.flush();
}
}
}
我的问题:
- 编写记录器是一个坏主意吗?我是否必须坚持使其适用于现有的日志库之一?
- 如果我决定始终使用此记录器,我会错过 SLF4J、Log4J、java.util.logging 等日志库的哪些功能?
编辑:感谢您的回答,这将是迄今为止的建议:
- 如果我可以避免编写自定义记录器,那就完美了。如果我有充分的理由这样做,我希望没有人会杀我。
- 当应用程序上线时,我会错过很多功能。
- 到目前为止,Chain-of-responsibility pattern看起来是一个在短时间内实现的好主意,让我可以更好地控制输出。
- 无论如何,我将再次检查代码,以防万一我错过了某些内容,并且我可以使其与众所周知的日志库一起使用。值得一试。
最佳答案
I had have lot of compatibility problems between the log libraries like SLF4J, Log4J, java.util.logging, etc. and Lotus Notes.
如果不知道这些问题是什么,就很难为您提供建议。可能有一个简单的修复或解决方法。
Is it a bad idea to write a logger?
重新发明轮子是个坏主意。除非您确实需要不同类型的轮子。
Do I have to insist in make it works one of the existent log libraries?
你的选择。
If I decide to use always this logger, what features I will miss from the log libraries like SLF4J, Log4J, java.util.logging, etc.?
很难说你会错过什么,因为这取决于你需要什么。
但是,您尝试的解决方案中缺少的一些内容包括:
- 记录到多个文件、文件轮换等。
- 记录到各种事件处理系统。
- 日志记录的粗粒度/细粒度可配置性...无需更改代码。
- 兼容性;例如如果您需要与使用标准日志记录框架的第三方软件集成。
如果其他 Java 程序员需要维护您的代码,他们可能会表示反感。
关于java - 我用 Java 创建了自己的记录器。这是一个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30679750/