我在 Java 中创建了自己的记录器。这是个坏主意吗?
I created my own logger in Java. Is it a bad idea?
我正在使用 Java 和 XPages 开发网络爬虫。我在 SLF4J、Log4J、java.util.logging 等日志库和 Lotus Notes 之间遇到了很多兼容性问题。
所以,我开发了自己的非常简单的记录器class。
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 看起来是个好主意,可以在短时间内实施并让我更好地控制输出。
- 无论如何,我将再次检查代码,以防万一我遗漏了什么,我可以让它与一个著名的日志库一起工作。值得一试。
如果其他日志库不能满足您的需求,为什么编写自己的记录器不是一个好主意?但说实话。这是 class 围绕 system.out.println() 的日志。我几乎不会称其为记录器。
这个问题是管理员/你很难解决这个问题。现在所有消息都将放在 log.nsf 中,因此当您调试时,您的日志将不清楚且难以阅读。
请查看 openlog 项目并在其周围添加您自己的包装器以使其按您希望的方式工作(如果需要)。这样您就可以拥有自己的日志数据库(或在同一个数据库中登录?),这将更容易进行故障排除。
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.?
很难说你会错过什么,因为这取决于你需要什么。
但是,您尝试的解决方案中缺少的一些内容包括:
- 记录到多个文件、文件轮换等。
- 记录到各种事件处理系统。
- 日志记录的粗粒度/细粒度可配置性......无需更改代码。
- 兼容性;例如如果您需要与使用标准日志记录框架的第 3 方软件集成。
然后是其他 Java 程序员在需要维护您的代码时可能会表达的反感。
好吧,我没有广泛使用记录器,但我想到的一件事是,对于日志库,您有一些非常方便的配置。
例如 - 您可以设置日志文件的大小,假设为 200 MB,一旦文件达到 200 MB,它就会创建一个新的日志文件,在此之上您可以设置最大限制,例如 10 GB或 10 个备份文件,因此如果所有日志文件达到 10GB,它将开始删除最旧的文件。
还有一些日志库提供不同的日志级别应用于不同的包。这在开发中特别有用。
如果您可以自己处理这些问题,我认为使用自定义记录器不会有太大问题。
我正在使用 Java 和 XPages 开发网络爬虫。我在 SLF4J、Log4J、java.util.logging 等日志库和 Lotus Notes 之间遇到了很多兼容性问题。
所以,我开发了自己的非常简单的记录器class。
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 看起来是个好主意,可以在短时间内实施并让我更好地控制输出。
- 无论如何,我将再次检查代码,以防万一我遗漏了什么,我可以让它与一个著名的日志库一起工作。值得一试。
如果其他日志库不能满足您的需求,为什么编写自己的记录器不是一个好主意?但说实话。这是 class 围绕 system.out.println() 的日志。我几乎不会称其为记录器。
这个问题是管理员/你很难解决这个问题。现在所有消息都将放在 log.nsf 中,因此当您调试时,您的日志将不清楚且难以阅读。
请查看 openlog 项目并在其周围添加您自己的包装器以使其按您希望的方式工作(如果需要)。这样您就可以拥有自己的日志数据库(或在同一个数据库中登录?),这将更容易进行故障排除。
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.?
很难说你会错过什么,因为这取决于你需要什么。
但是,您尝试的解决方案中缺少的一些内容包括:
- 记录到多个文件、文件轮换等。
- 记录到各种事件处理系统。
- 日志记录的粗粒度/细粒度可配置性......无需更改代码。
- 兼容性;例如如果您需要与使用标准日志记录框架的第 3 方软件集成。
然后是其他 Java 程序员在需要维护您的代码时可能会表达的反感。
好吧,我没有广泛使用记录器,但我想到的一件事是,对于日志库,您有一些非常方便的配置。
例如 - 您可以设置日志文件的大小,假设为 200 MB,一旦文件达到 200 MB,它就会创建一个新的日志文件,在此之上您可以设置最大限制,例如 10 GB或 10 个备份文件,因此如果所有日志文件达到 10GB,它将开始删除最旧的文件。
还有一些日志库提供不同的日志级别应用于不同的包。这在开发中特别有用。
如果您可以自己处理这些问题,我认为使用自定义记录器不会有太大问题。