Як налаштувати журналювання Java за допомогою файлу властивостей? (java.util.logging)


82

У мене дурна проблема реєстрації Java: я завантажую конфігурацію ведення журналу з конфігураційного файлу мого додатка - але він просто нічого не реєструє після прочитання файлу (що схоже майже на приклади, які ви знайдете в мережі, за винятком додаткова конфігурація програми - видалення цього також не допомагає). Рядок журналу "ініціалізація ..." виглядає чудово, але "стартовий додаток" та будь-які подальші повідомлення ні реєструються на консолі, ні файл журналу ніколи не створюється. Чого мені тут не вистачає?

Код реєстратора виглядає так:

...
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

Відповіді:


28

Гаразд, перша інтуїція тут:

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

Синтаксичний аналізатор файлів Java не все такий розумний, я не впевнений, що він це впорається. Але я піду ще раз переглянути документи ....

Тим часом спробуйте:

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

Оновлення

Ні, ну, потрібно було більше кави. Не зважай.

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


Чергове оновлення

Цей рядок:

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

має додатковий кінцевий ключ. Він не компілюється. Переконайтесь, що ви працюєте з файлом класу, яким ви вважаєте себе.


Ну, це справді має щось пов’язане з рядком readConfiguration - я пройшов через це за допомогою налагоджувача, і всі властивості LogManager очищаються після цього виклику.
VolkA

5
О так, зрозумів - я використовую один і той же вхідний потік двічі, тому мені потрібно переставити його за допомогою configFile.reset () - інакше виклик loadConfiguration () не буде мати чого прочитати. До речі. ) було просто помилкою копіювання з мого робочого коду.
VolkA

1
Я не зовсім впевнений, що тут відповідь?
Ondra Žižka,

@ OndraŽižka відповідь: "ваш код не працював через синтаксичну помилку."
Charlie Martin

103

Ви можете встановити файл конфігурації журналу за допомогою командного рядка:

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

цей спосіб здається чистішим та простішим у обслуговуванні.


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).


Сер, чи можу я знати, де знаходиться онлайн-документація, яку% h передає до мого дому,% u вирішує щось інше тощо.
Лук Арон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.