Как записать исключение в Java - PullRequest
0 голосов
/ 19 июня 2011

Я запускаю сложное многопоточное 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 для отладки.

1 Ответ

1 голос
/ 19 июня 2011

Я вижу, что вы используете java.util.logging.Logger.Вместо создания FileHandler при каждом вызове log, сделайте это в статической секции ExceptionLogger.И инициализируйте регистратор, когда вы объявляете его.

private static Logger logger = Logger.getLogger("messages");
static {
    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);
}

Затем вместо обычной подписи для log просто используйте

public void log(Level level,
                String msg)

для обычных сообщений или

public void log(Level level,
                String msg,
                Throwable thrown)

для исключений.

См. http://download.oracle.com/javase/6/docs/api/java/util/logging/Logger.html

И есть гораздо лучшие способы настроить его через свойства.

В конечном счете, вам, вероятно, не нужен пользовательский класскак вы можете просто использовать Logger напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...