Есть ли способ установить уровень java .util.logging для класса на СЕРЬЕЗНЫЙ, но только для одного обработчика? - PullRequest
0 голосов
/ 06 мая 2020

Я хочу изменить уровень ведения журнала для одного класса (для обсуждения назовем его com.example.foo) на SEVERE, но только для ConsoleHandler; Я хочу, чтобы уровень FileHandler остался INFO.

Есть ли способ сделать это в файле свойств java .util.logging?

1 Ответ

1 голос
/ 06 мая 2020

Зависит от используемого вами LogManager. Предполагая, что это стандартный LogManager , вы можете изменить все экземпляры ConsoleHandler, используя:

com.example.foo.level=INFO
com.example.foo.handlers=java.util.logging.FileHandler,java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level = SEVERE
java.util.logging.FileHandler.level = INFO

Если вы хотите настроить только один экземпляр ConsoleHandler, тогда это сложнее, так как всегда требует доставки некоторый код регистрации с вашим проектом. Вот варианты на выбор:

  1. Вы можете создать подкласс ConsoleHandler как класс publi c с конструктором publi c no-arg. Это новое полное имя класса обеспечивает уникальное пространство имен для файла свойств LogManager. Затем вы устанавливаете этот подкласс в средство ведения журнала, которое хотите настроить, вместо ConsoleHandler. Чем больше подклассов вы создаете, тем больше уникальных обработчиков вам нужно. Например:

package com.example; public ConsoleHandler1 extends ConsoleHander { }

Тогда в вашем файле свойств это выглядит так:

com.example.foo.level=INFO
com.example.foo.handlers=java.util.logging.FileHandler,com.example.ConsoleHandler1
java.util.logging.ConsoleHandler.level = INFO
com.example.ConsoleHandler1.level = SEVERE
java.util.logging.FileHandler.level = INFO
Используйте параметр LogManager config. Согласно документации:

Свойство «config». Это свойство предназначено для запуска произвольного кода конфигурации. Свойство определяет список имен классов, разделенных пробелами или запятыми. Для каждого названного класса будет создан новый экземпляр. Конструктор по умолчанию для каждого класса может выполнять произвольный код для обновления конфигурации ведения журнала, такой как установка уровней регистратора, добавление обработчиков, добавление фильтров и т. Д. c.

Классы конфигурации очень свободны, и вы может даже читать ваши собственные настраиваемые свойства LogManager . Примером класса будет:

package com.example;
import java.util.logging.*;

public class FooLoggerConsoleSevere {
    public static final Logger logger = Logger.getLogger("com.example.foo");

    public FooLoggerConsoleSevere() {
        ConsoleHandler con = new ConsoleHandler();
        con.setLevel(Level.SEVERE);
        logger.addHandler(con);
    }
}

Затем запустите конфигурацию следующим образом:

config=com.example.FooLoggerConsoleSevere
com.example.foo.level=INFO
java.util.logging.FileHandler.level = INFO
Вы всегда можете написать метод в своем приложении, чтобы найти регистратор и найти обработчик и изменить уровень .
...