Ведение журнала Java: консоль против файла

1

У меня вопрос о java.util.Logger. Я установил обработчик и изменил формат следующим образом:

Logger logger = Logger.getLogger("TotalLog");
FileHandler fh = new FileHandler("log/total.%g.log", 5242880, 20, true);
fh.setFormatter(new Formatter() {

  @Override
  public String format(LogRecord record) {
    return new Date(record.getMillis()) + " " + record.getLevel() + ": " + record.getMessage() + "\n";
  }
});

logger.addHandler(fh);
logger.log(Level.INFO, "****************************************");

Проблема заключается в том, что форматтер влияет на файл журнала. Но консоль не показывает сообщения в этом формате. Кроме того, такой код работает в консоли, но не работает в файле.

logger.log(Level.INFO, "{0} user folders registered.", userfolders.size());

Это означает, что на консоли его печать: 4 user folders registered.
Но в файле: {0} user folders registered.

Как решить эти проблемы?

EDIT:
Итак, вот решение, я нашел ссылку, которая показывает, как получить доступ к консольному обработчику по умолчанию для журнала: logging in java

Поэтому вместо создания анонимного класса я создал новый класс с именем LogFormatter:

public class LogFormatter extends Formatter {
  @Override
  public String format(LogRecord record) {
    return new Date(record.getMillis()) + " " + record.getLevel() + ": " + record.getMessage() + "\n";
  }
}

И немного изменил код:

Logger logger = Logger.getLogger("TotalLog");
FileHandler fh = new FileHandler("log/total.%g.log", 5242880, 20, true);
fh.setFormatter(new LogFormatter());
logger.addHandler(fh);
logger.getParent().getHandlers()[0].setFormatter(new LogFormatter());
logger.log(Level.INFO, "****************************************");

Тем не менее, я не могу понять, как сделать параметризованную регистрацию. Между тем я заменил код на:

logger.log(Level.INFO, userfolders.size() + " user folders registered.");

есть идеи как это сделать?

  • 0
    Почему вы пишете код для этого? Вы можете настроить шаблон форматирования (даже программно) для достижения того же результата. Как это, вы, вероятно, сломал логику замены.
  • 0
    Журнал по умолчанию выглядит следующим образом: ДАТА КЛАСС: УРОВЕНЬ МЕТОДА: СООБЩЕНИЕ Однако мне нужен этот формат УРОВЕНЬ ДАТЫ: СООБЩЕНИЕ
Показать ещё 1 комментарий
Теги:
logging

1 ответ

0
Лучший ответ

Вызов formatMessage из Formatter класса (или скопировать и настроить его для ваших нужд), например:

public class LogFormatter extends Formatter {
  @Override
  public String format(LogRecord record) {
    return new Date(record.getMillis()) + " " + record.getLevel() + ": " + super.formatMessage(record) + "\n";
  }
}

См. Комментарий для метода format на http://docs.oracle.com/javase/7/docs/api/java/util/logging/Formatter.html:

public abstract String format (запись LogRecord)

Отформатируйте данную запись журнала и верните форматированную строку.

В результате форматированная строка обычно включает локализованную и отформатированную версию поля сообщения LogRecord. Для локализации и форматирования поля сообщения рекомендуется использовать метод formatMessage (java.util.logging.LogRecord).

  • 0
    работает так, как я хотел, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню