我为JUL创建了一个新的日志处理程序,它扩展了java.util.logging.Handler。
我是否有任何标准化的方法可以对LogRecord处理过程中发生的错误做出反应(如log4j中的LogLog)?
只使用JUL-Logger导致另一个必须由同一个处理程序处理的LogRecord。
所以,我基本上寻找一种(标准的)方式来记录消息而不创建无限循环。目前,我正在比较sourceClassName以防止这样的循环。
答案 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);
}
}
}