Как настроить ведение журнала Java с помощью файла свойств? (java.util.logging)

82

У меня глупая проблема с журналированием java: я загружаю конфигурацию журналирования из файла конфигурации моего приложения, но он просто ничего не регистрирует после прочтения файла (что очень похоже на примеры, которые вы найдете в сети, за исключением дополнительная настройка приложения - удаление тоже не помогает). Строка журнала "initializing ..." выглядит нормально, но "стартовое приложение" и любые другие сообщения не регистрируются в консоли, и файл журнала никогда не создается. Что мне здесь не хватает?

Код Logger выглядит так:

...
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

Properties preferences = new Properties();
try {
    FileInputStream configFile = new FileInputStream("/path/to/app.properties");
    preferences.load(configFile);
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");
...

А это файл конфигурации:

appconfig1 = foo
appconfig2 = bar

# Logging
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

# File Logging
java.util.logging.FileHandler.pattern = %h/myApp.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = INFO

# Console Logging
java.util.logging.ConsoleHandler.level = ALL
VolkA
источник

Ответы:

28

Хорошо, первая интуиция здесь:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

Синтаксический анализатор файлов Java prop не так уж и умен, я не уверен, что он справится с этим. Но я пойду еще раз посмотрю документы ....

А пока попробуйте:

handlers = java.util.logging.FileHandler
java.util.logging.ConsoleHandler.level = ALL

Обновить

Нет, ну, нужно еще кофе. Ничего.

Хотя я думаю больше, обратите внимание, что вы можете использовать методы в Свойствах для загрузки и печати prop-файла: возможно, стоит написать минимальную программу, чтобы увидеть, что, по мнению Java, читает в этом файле.


Еще одно обновление

Эта строка:

    FileInputStream configFile = new FileInputStream("/path/to/app.properties"));

имеет дополнительный конец. Он не компилируется. Убедитесь, что вы работаете с файлом класса, которым считаете себя.

Чарли Мартин
источник
Что ж, похоже, что это имеет какое-то отношение к строке readConfiguration - я прошел через это с помощью отладчика, и все свойства LogManager очищаются после этого вызова.
VolkA 06
5
О да, понял - я использую один и тот же входной поток дважды, поэтому мне нужно изменить его положение с помощью configFile.reset () - иначе вызову loadConfiguration () нечего будет читать. Кстати. the) было просто ошибкой копирования из моего рабочего кода.
VolkA 06
1
Я не совсем уверен, какой здесь ответ?
Ондра Жижка
@ OndraŽižka ответ: «ваш код не работал из-за синтаксической ошибки».
Чарли Мартин
102

вы можете установить файл конфигурации ведения журнала через командную строку:

$ java -Djava.util.logging.config.file=/path/to/app.properties MainClass

так кажется чище и проще в обслуживании.

cd1
источник
1
Да, я, вероятно, добавлю проверку, установлено ли это свойство, и позволю ему перезаписать мою конфигурацию - хотя было бы неплохо иметь все это в одном файле конфигурации, который работает "из коробки". Благодаря!
VolkA
12

Я пробовал ваш код в приведенном выше коде, не используйте оператор [preferences.load (configFile);], и он будет работать. Здесь выполняется образец кода

public static void main(String[]s)
{

    Logger log = Logger.getLogger("MyClass");
    try {
    FileInputStream fis =  new FileInputStream("p.properties");
    LogManager.getLogManager().readConfiguration(fis);
    log.setLevel(Level.FINE);
    log.addHandler(new java.util.logging.ConsoleHandler());
    log.setUseParentHandlers(false);

    log.info("starting myApp");
    fis.close();

    } 
    catch(IOException e) {
    e.printStackTrace();
    }
}
Рана
источник
1
где должны быть свойства p.properties по отношению к основному классу?
Луис Соарес
9
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

//Properties preferences = new Properties();
try {
    //FileInputStream configFile = new //FileInputStream("/path/to/app.properties");
    //preferences.load(configFile);
    InputStream configFile = myApp.class.getResourceAsStream("app.properties");
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");

это работает .. :) вы должны передать InputStream в readConfiguration ().

Викки Кумар
источник
3

Вы ищете файл журнала по правильному пути:% h / one% u.log

Здесь% h соответствует вашему дому: В Windows это по умолчанию: C: \ Documents and Settings (имя_пользователя).

Я попробовал опубликованный вами образец кода, и он отлично работает после того, как вы укажете путь к файлу конфигурации (logging.properties через код или java args).

Techzen
источник
Сэр, могу ли я узнать, где находится онлайн-документация, в которой указано, что% h разрешает мой дом,% u решает что-то еще и т. Д.
Лук Арон