java - 我用 Java 创建了自己的记录器。这是一个坏主意吗?

标签 java logging xpages lotus-notes

我正在使用 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/

相关文章:

java - 设置 log4j 日志级别

java - 从小程序控制台中删除 Java 插件消息

xpages - 主题不适用于按钮

Xpages - 使用 Dojo 模块

java - 无法反序列化对对象数组的 JSON 响应

java - 在java中解析引用的文本

java - 如果我终止 jUnit 测试会发生什么

javac 无法找到导入

logging - 如何在Weblogic服务器中使用log4j

timezone - 在 dojo 数据网格中显示时间