У меня вопрос о 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.");
есть идеи как это сделать?
Вызов 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).