在JUL日志处理程序中记录

时间:2016-02-23 12:25:26

标签: java logging

我为JUL创建了一个新的日志处理程序,它扩展了java.util.logging.Handler。

我是否有任何标准化的方法可以对LogRecord处理过程中发生的错误做出反应(如log4j中的LogLog)?

只使用JUL-Logger导致另一个必须由同一个处理程序处理的LogRecord。

所以,我基本上寻找一种(标准的)方式来记录消息而不创建无限循环。目前,我正在比较sourceClassName以防止这样的循环。

2 个答案:

答案 0 :(得分:1)

应使用Handler.reportError(String, Exception, int)报告处理程序内部发生的异常。这会报告已安装的可以自定义的ErrorManager的故障。使用它应该照顾大多数无限循环。

但是,如果发布行为依赖于也生成日志记录的lib,那么您必须求助于检测循环。使用java.lang.ThreadLocal和某种枚举来跟踪状态变化。

cloneRowWithValues()

答案 1 :(得分:0)

目前,我正在寻找这个解决方案:

public class MyHandler extends Handler {
  private final static String className = MyHandler.class.getName();
  private final static Logger logLogger = Logger.getLogger(className);
  ...

  @Override
  public void publish(LogRecord record) {
    if (!super.isLoggable(record)) {
      return;
    }

    String loggerName = record.getLoggerName(); //EDIT: Was getSourceClassName before
    if (loggerName != null && loggerName.equals(className)) {
      // This is our own log line; returning immediately to prevent endless loops
      return;
    }

    try {
      // ... do actual handling...
    } catch(Exception e) {
      logLogger.logp(level.SEVERE, className, "publish", "something went wrong", e);
    }
  }
}