Я запускаю сложное многопоточное Java-приложение и сталкиваюсь с некоторой проблемой с исключениями при ведении журнала.
Существует класс ExceptionLogger, который обрабатывает исключения, вот фрагмент кода.
public class ExceptionLogger {
private enum EXTYPE {
ERROR, INFO, WARNING
}
private static Logger logger;;
private static void log(String message, EXTYPE msgtype) {
boolean append = true;
try {
FileHandler fh = new FileHandler("messages.log", append);
fh.setFormatter(new Formatter() {
@Override
public String format(LogRecord rec) {
StringBuffer buf = new StringBuffer(1000);
buf.append(new java.util.Date());
buf.append(' ');
buf.append(rec.getLevel());
buf.append(' ');
buf.append(formatMessage(rec));
buf.append('\n');
return buf.toString();
}
});
logger = Logger.getLogger("messages");
logger.addHandler(fh);
switch (msgtype) {
case WARNING:
logger.warning(message);
break;
case ERROR:
logger.severe(message);
break;
case INFO:
logger.info(message);
break;
}
} catch (IOException e) {
e.printStackTrace();
}
public static synchronized void logEx(Exception e) {
// if(e.getMessage().compareTo("Widget is disposed")==0) return;
log("Error message :" + e.getMessage(), EXTYPE.ERROR);
e.printStackTrace();
log("cause :" + e.getCause(), EXTYPE.INFO);
}
}
Теперь проблема заключается в том, что когда исключения из нескольких потоков журнала создаются как файлы messages.log.1 сообщения.log.2 ...
Несмотря на то, что я объявил ее как синхронизированную функцию, потоки не должны ожидать регистрации своего исключения вместо создания новых файлов.
Также еще одна вещь с e.getMessage () просто возвращает мне сообщение как исключение нулевого указателя ... Нет ссылки на класс или строку нет.есть.Как это получить?Код скоро поступит в производство, и я не могу полагаться на e.printStacktrace для отладки.