java.util.logging: как подавить строку даты - PullRequest
19 голосов
/ 01 июня 2010

Я пытаюсь подавить вывод строки даты во время регистрации при использовании стандартного регистратора в java.util.logging. Например, вот типичный вывод:

Jun 1, 2010 10:18:12 AM gamma.utility.application info
<br>INFO: ping: db-time=2010-06-01 10:18:12.0, local-time=20100601t101812, duration=180000
<br>Jun 1, 2010 10:21:12 AM gamma.utility.application info
<br>INFO: ping: db-time=2010-06-01 10:21:12.0, local-time=20100601t102112, duration=180000

Я хотел бы избавиться от Jun 1, 2010... строк, они просто загромождают мой вывод журнала. Как я могу это сделать?

Ответы [ 3 ]

32 голосов
/ 23 мая 2012

В Java SE 7 есть новое системное свойство: java.util.logging.SimpleFormatter.format .

Это же свойство также можно настроить в свойствах java.util.logging.файл (logging.properties).Если вы являетесь пользователем Eclipse и вас раздражает двухстрочное сообщение в выводе консоли, вы можете изменить файл jre logging.properties (JDK_HOME / jre / lib / logging.properties) следующим образом:

java.util.logging.SimpleFormatter.format =% 4 $ s:% 5 $ s [% 1 $ tc]% n

Некоторые примеры форматов доступны здесь: http://docs.oracle.com/javase/7/docs/api/index.html?java/util/logging/SimpleFormatter.html.

13 голосов
/ 03 июня 2010

Проблема вызвана обработчиком в родительском журнале. Решение состоит в том, чтобы удалить все обработчики из родительского журнала, а затем добавить собственный настраиваемый обработчик. Этот код удаляет обработчики из родительского журнала:

      for(Handler iHandler:log.getParent().getHandlers())
        {
        log.getParent().removeHandler(iHandler);
        }
5 голосов
/ 01 июня 2010

Напишите пользовательский форматировщик, расширяющий класс java.util.logging.Formatter, и реализуйте метод String format(LogRecord) в соответствии с вашими потребностями. Например, следующий форматер показывает только сообщение журнала (и бросаемую трассировку стека, если регистрируется исключение):

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

class CustomRecordFormatter extends Formatter {
    @Override
    public String format(final LogRecord r) {
        StringBuilder sb = new StringBuilder();
        sb.append(formatMessage(r)).append(System.getProperty("line.separator"));
        if (null != r.getThrown()) {
            sb.append("Throwable occurred: "); //$NON-NLS-1$
            Throwable t = r.getThrown();
            PrintWriter pw = null;
            try {
                StringWriter sw = new StringWriter();
                pw = new PrintWriter(sw);
                t.printStackTrace(pw);
                sb.append(sw.toString());
            } finally {
                if (pw != null) {
                    try {
                        pw.close();
                    } catch (Exception e) {
                        // ignore
                    }
                }
            }
        }
        return sb.toString();
    }
}

Вот как вы его используете:

import java.util.logging.ConsoleHandler;
import java.util.logging.Logger;

class A {
    private static final Logger LOGGER = Logger.getLogger(A.class.getName());

    static {
        CustomRecordFormatter formatter = new CustomRecordFormatter();
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setFormatter(formatter);
        LOGGER.addHandler(consoleHandler);
    }

    public void doSomething() {
        LOGGER.info("something happened");
    }
}
...