我在 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();
        } 
    }
}

我的问题:

编辑:感谢您的回答,这将是目前的建议:

如果其他日志库不能满足您的需求,为什么编写自己的记录器不是一个好主意?但说实话。这是 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,它将开始删除最旧的文件。

还有一些日志库提供不同的日志级别应用于不同的包。这在开发中特别有用。

如果您可以自己处理这些问题,我认为使用自定义记录器不会有太大问题。