Как изменить формат журнала с помощью Simple Formatter?
Я пытался добавить эту строку в logging.properties, но вывод не меняется
java.util.logging.SimpleFormatter.format='%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n'
Я также попробовал System.setProperty, но он все еще не работает, что я делаю не так?
import java.util.*;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.io.*;
import java.awt.*;
public class LoggerFormat
{
private static final Logger logger = Logger.getLogger(LoggerFormat.class.getName());
public static void main(String[] args)
{
System.setProperty("java.util.logging.SimpleFormatter.format", "%1$tF %1$tT %4$s %2$s %1$tL");
SimpleFormatter sf = new SimpleFormatter();
System.out.println("-- main method starts --");
logger.info("in LoggerFormat");
logger.warning("a test warning");
}
}
2 ответа
Куча вещей может пойти не так здесь. Сначала убедитесь, что вы используете версию Java (7 b138), в которой исправлено JDK-6381464: SimpleFormatter должен использовать однострочный формат.
Одна вещь, которая не объяснена в документации, заключается в том, что кавычки нужны только для шаблона, если вы устанавливаете шаблон с помощью командной строки, а шаблон содержит символ пробела.
Так что если вы устанавливаете формат в logging.properties, тогда отбросьте кавычки:
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n
Если вы устанавливаете формат как системное свойство, вы должны установить его при запуске:
-Djava.util.logging.SimpleFormatter.format="%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n"
Следующее, что вы хотите сделать, это использовать тестовую программу, чтобы убедиться, что ваш шаблон компилируется. Если синтаксис шаблона неправильный, SimpleFormatter вернется к шаблону по умолчанию. Вот пример тестовой программы:
public static void main(String[] args) throws Exception {
final String format = "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n";
final String key = "java.util.logging.SimpleFormatter.format";
test(format);
test(System.getProperty(key, format));
test(LogManager.getLogManager().getProperty(key));
test(new SimpleFormatter());
}
private static void test(Formatter f) {
LogRecord record = newLogRecord();
System.out.println(f.format(record));
}
private static LogRecord newLogRecord() {
LogRecord r = new LogRecord(Level.INFO, "Message");
r.setSourceClassName("sourceClassName");
r.setSourceMethodName("sourceMethodName");
r.setLoggerName("loggerName");
return r;
}
private static void test(String format) {
if (format != null) {
LogRecord record = newLogRecord();
Throwable t = record.getThrown();
System.out.println(String.format(format,
new java.util.Date(record.getMillis()),
record.getSourceClassName(),
record.getLoggerName(),
record.getLevel().getLocalizedName(),
record.getMessage(),
t != null ? t.toString() : ""));
//TODO: Place printStackTrace into a string.
} else {
System.out.println("Format is null.");
}
}
Наконец, формат может быть установлен только один раз при запуске. Как только SimpleFormatter загружен, этот шаблон используется для жизни класса. С помощью System.setProperty
будет работать только в том случае, если вы установите шаблон до начала регистрации, поэтому не зависите от того, какой маршрут когда-либо работал в сложной программе.
https://logging.apache.org/log4j/2.0/manual/messages.html. очень хорошее расширение