Java.util.logging: как подавить строку даты
Я пытаюсь подавить вывод строки durinng logging при использовании регистратора по умолчанию в java.util.logging. Например, вот типичный вывод:
Jun 1, 2010 10:18:12 AM gamma.utility.application info
INFO: ping: db-time=2010-06-01 10:18:12.0, local-time=20100601t101812, duration=180000
Jun 1, 2010 10:21:12 AM gamma.utility.application info
INFO: ping: db-time=2010-06-01 10:21:12.0, local-time=20100601t102112, duration=180000
Я хотел бы избавиться от строк Jun 1, 2010...
, они просто загромождали мой выход журнала. Как я могу это сделать?
Ответы
Ответ 1
Проблема вызвана обработчиком в родительском журнале. Решение состоит в том, чтобы удалить все обработчики из родительского журнала, а затем добавить собственный обработчик. Этот код удаляет обработчики из родительского журнала:
for(Handler iHandler:log.getParent().getHandlers())
{
log.getParent().removeHandler(iHandler);
}
Ответ 2
Из 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.
Ответ 3
Напишите собственный класс форматирования, расширяющий класс 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");
}
}