Как изменить формат журнала с помощью 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. очень хорошее расширение

Другие вопросы по тегам