java.util.logging - Как заставить все регистраторы подчиняться заданному формату из среды выполнения приложения?(HSQLDB) - PullRequest
0 голосов
/ 02 октября 2018

В моем приложении я бы хотел какой-то способ форматирования.Для этого я написал SingleLineFormatter extends Formatter.

Теперь я пытаюсь настроить все Logger s для его использования, но не могу понять это.

        LogManager.getLogManager().readConfiguration((InputStream) configIS);

        Collections.list(LogManager.getLogManager().getLoggerNames()).forEach(
            loggerName -> {
                List<Handler> handlers = Arrays.asList(Logger.getLogger(loggerName).getHandlers());
                System.out.println(" * Logger " + loggerName + ": " + handlers.size());
                handlers.forEach(handler -> System.out.println("   HF: " + handler.getFormatter()));
                //handlers.forEach(handler -> handler.setFormatter(new SingleLineFormatter()));
            }
        );/**/
        log.info("Logging test");

Эточитает конфигурацию, применяет ее ко всем найденным обработчикам.

Oct 02, 2018 10:42:10 PM cz.dynawest.logging.LoggingUtils initLogging
INFO: Log config file not found: #/logging.properties  Using LoggingUtils' default.
 * Logger cz.dynawest.csvcruncher.App: 0
 * Logger global: 0
 * Logger cz.dynawest.logging.LoggingUtils: 0
2018-10-02 22:42:10 INFO cz.dynawest.logging.LoggingUtils initLogging:   Logging test
 * Logger : 2
   HF: cz.dynawest.logging.SingleLineFormatter@34c45dca
   HF: cz.dynawest.logging.SingleLineFormatter@52cc8049

Однако остальные Logger все еще используют то, с чем они были настроены.Вероятно, просто по умолчанию JUL.

Oct 02, 2018 10:42:10 PM org.hsqldb.persist.Logger logInfoEvent
INFO: checkpointClose start

Я знаю, что могу управлять этим из logging.properties JUL в моей JVM.
Но я хочу распространять приложение и хочу, чтобы все сообщения журнала форматировались

Как заставить все сообщения, отправляемые в JUL, отформатировать с помощью моего Formatter?

Есть -Djava.util.logging.config.file=/path/to/app.properties, но это выходит за рамкидля моего конкретного случая.(И все равно не работает.)

Обновление: Похоже, что сторонняя регистрация не проходит через JUL.Итак, вопрос в том, если это правда, как мне настроить другие фреймворки?

Вот файл, который загружается в LogManager.Есть довольно много экспериментов, поэтому не все правильные.

# Handlers
handlers = java.util.logging.ConsoleHandler java.util.logging.FileHandler

# Console
# The logging of the app actually reacts to this line.
java.util.logging.ConsoleHandler.formatter = cz.dynawest.logging.SingleLineFormatter
#java.util.logging.ConsoleHandler.formatter = cz.dynawest.logging.SimplestFormatter
java.util.logging.ConsoleHandler.level = ALL

# File
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.pattern = app.log
java.util.logging.FileHandler.formatter = cz.dynawest.logging.SingleLineFormatter
java.util.logging.FileHandler.limit = 0
java.util.logging.FileHandler.append = true


# Default global logging level.
.formatter = cz.dynawest.logging.SimplestFormatter
.level = INFO

#global.formatter = cz.dynawest.logging.SimplestFormatter
#root.formatter = cz.dynawest.logging.SimplestFormatter
#cz.dynawest.csvcruncher.App.formatter = cz.dynawest.logging.SimplestFormatter
#cz.dynawest.csvcruncher.App.handlers = java.util.logging.ConsoleHandler
#.useParentHandlers = false

# Various customizations.

org.apache.commons.beanutils.converters.level=INFO

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

В моем приложении я бы хотел какой-то способ форматирования.Для этой цели я написал> SingleLineFormatter расширяет Formatter

Поскольку в JDK 7 java.util.logging.SimpleFormatter поддерживает формат в одну строку .

Это читает конфигурацию, применяет ее ко всем найденным обработчикам.

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

Как я могу принудительно отформатировать все сообщения, отправляемые в JUL, с моим Formatter?

Тамis -Djava.util.logging.config.file = / path / to / app.properties, но это выходит за рамки моего конкретного случая.(И все равно не работает.)

У вас уже есть доступ к LogManager, поэтому вы можете установить свойства из Java следующим образом:

 private static void loadProperties() {
    Properties props = new Properties();
    props.put("java.util.logging.ConsoleHandler.formatter", "cz.dynawest.logging.SingleLineFormatter");
    props.put("org.apache.commons.beanutils.converters.level", "INFO");

    try(ByteArrayOutputStream out = new ByteArrayOutputStream()) {
        props.store(out, "");
        LogManager.getLogManager().readConfiguration(new ByteArrayInputStream(out.toByteArray()));
    } catch (IOException ioe) {
        throw new AssertionError(ioe);
    }
}

Если вы используете JDK 9 илиновее, чем вы должны использовать LogManager.updateConfiguration (java.util.function.Function) вместо.

Похоже, что стороннее ведение журнала не проходит через JUL.Итак, вопрос в том, если это правда, как мне настроить другие фреймворки?

Вы должны будете определить, маршрутизируют ли фреймворки друг другу.Вам нужно всего лишь изменить формат платформы, публикующей записи в выходном источнике.

0 голосов
/ 03 октября 2018

В попытках соответствовать тому, что библиотека может захотеть, чтобы я использовал для регистрации, я переключился на SLF4J и Logback.Не помогло.

Поэтому я посмотрел на конкретную библиотеку, которая вызывает проблемы с журналированием - HSQLDB.

Проблема заключается в том, что она делает некоторые попытки освоить все распространенные фреймворки и обходит мои попыткинастроить его внешне.Вот пример: FrameworkLogger

Затем я нашел в руководстве по HSQLDB :

HyperSQL также поддерживает log4J и ведение журнала JDK.Те же сведения о событиях, которые передаются во внутренний журнал, передаются во внешние каркасы ведения журнала.Эти структуры обычно настраиваются вне HyperSQL.Сообщения журнала содержат строку «hsqldb.db».сопровождаемый уникальным идентификатором (16-символьная строка) базы данных, сгенерировавшей сообщение, чтобы их можно было идентифицировать в контексте сервера с несколькими базами данных.

Поскольку стандартная структура ведения журналов JDK имеет несколько недостатков, HyperSQL настраиваетэта структура ведения журнала для лучшей работы.Если вы не хотите, чтобы HyperSQL настраивал структуру ведения журналов JDK, вы должны включить в свою среду свойство системного уровня hsqldb.reconfig_logging = false.

Я попытался установить hsqldb.db. Logger, но это не помоглоне работает.

Так что, думаю, я буду придерживаться JUL и выключу hsqldb.reconfig_logging=false.

Кстати, вот хороший обзор конфигурации JUL .

...