Я создал класс logger, используя FileHandler для записи журнала в файл, но вместо этого он только печатает на консоль - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь создать файл журнала java, который будет записывать вывод в файл в папке проекта (NetBeans, MacOS). Я делаю это для школьного проекта, поэтому я не могу использовать Log4j. Я рассмотрел ранее заданные вопросы по этой теме и попытался реализовать эти решения, но все еще не вижу успеха. Нужно ли расширять путь к файлу или есть основной компонент, который мне не хватает? Любые шаги в правильном направлении будут полезны, спасибо.

Я попытался расширить путь к файлу, чтобы перейти от папки пользователей до отдельной папки проекта в NetBeans. Я просмотрел довольно много ресурсов и примеров, но какой бы элемент я пропустил, мне так и не удалось выяснить.

public class log {
   private final static Logger LOGGER = 
Logger.getLogger(log.class.getName());
   private final static FileHandler handleLog = null;



   public static void start() throws IOException, 
SecurityException{
    FileHandler handleLog = new 
FileHandler("/Users/cassie/NetBeansProjects/GlobalConsulting- 
   userLog.%u.%g.txt", 1024 * 1024, 10, true);
    SimpleFormatter simple = new SimpleFormatter();
    handleLog.setFormatter(simple);
    LOGGER.addHandler(handleLog);
    LOGGER.setLevel(Level.INFO);

   }

   public static void main(String[] args) throws IOException, 
SecurityException{
       start();
       LOGGER.info("------------------START--------------------");

   }
}

Когда я вызываю его в другом файле, я так и делал.

LOGGER.log(Level.INFO, "{0} logged in", currentUser.getUsername());

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

1 Ответ

0 голосов
/ 13 ноября 2019

Я не получаю никаких сообщений об ошибках, но все выходные данные идут прямо на консоль.

Используйте printConfig в вашем коде, чтобы определить состояниеДерево регистратора. Чтобы просмотреть вывод в файл журнала, вам необходимо:

  1. Обработчик файлов создается без исключения. Из вашего вопроса кажется, что это работает.
  2. Вы должны быть в состоянии увидеть, что файл журнала был хотя бы создан (и пуст) при запуске вашей программы. По умолчанию, если обработчик файлов не может определить путь, он либо выдаст ошибку, либо создаст файл журнала в домашнем каталоге пользователя с именем java0.log. Обычно это происходит, если вы указали путь к файлу, а каталоги не существуют до запуска программы.
  3. Обработчик файлов должен быть присоединен к дереву регистратора на регистрируемом узле или родительском регистраторе. Если обработчик файла подключен к дочернему регистратору с точки зрения вашей программы, он не увидит сообщения журнала. Записи журнала перемещаются по дереву регистратора к родительским обработчикам. Обычно ConsoleHandler устанавливается в корневом логгере, поэтому он будет видеть все, в отличие от вашего обработчика файлов, который установлен на дочернем элементе корня.
  4. Обработчик файлов должен иметь правильный уровень. Используйте Level.ALL для обработчика.
  5. В обработчике файлов не должен быть установлен фильтр (null). JDK не поставляется ни с одним, поэтому это не должно быть проблемой.
  6. Уровень регистратора должен быть установлен так, чтобы вы фактически генерировали запись журнала для обработчиков.
  7. Другойфункция удалила или сбросила менеджер журналов, который удаляет вашу конфигурацию. SecurityManager может определить это, но, скорее всего, это не причина, поскольку вы не используете сторонние библиотеки.

Ответьте на эти вопросы, и вы сможете определить, почему вы не видитефайл журнала.

...