Java утилита Logger не записывает в файл - PullRequest
1 голос
/ 30 мая 2019

Я написал глупый Logger для моего приложения. Он записывает в файл журнала информацию, предупреждения и серьезные сообщения. Некоторое время назад он работал отлично, но внезапно перестал работать без видимой причины. Он продолжает создавать файл журнала, если он не существует, но содержимое не записывается. Я не могу найти, почему это не работает сейчас. Я бы хотел поблагодарить за помощь.

Отладка с помощью моей IDE, я понимаю, что сообщения правильно передаются в регистратор, и выполняется logger.info ().

public class FsLogger {

    private static FsLogger instance;

    private final String filename = "Logs/LogFsForensics.log";
    private final String loggerName = "FsLogger";
    private static Logger logger;   
        private FileHandler fh;
        private final int limit = 1024*10000; //10 MB
        private SimpleFormatter sf;

    private FsLogger() {
        logger =  Logger.getLogger(loggerName);

        sf = new SimpleFormatter();
        try {
            fh = new FileHandler(filename, limit, 1, true);
            sf = new SimpleFormatter();
            fh.setFormatter(sf);

            logger.addHandler(fh);
        } catch (SecurityException | IOException e) {           
            e.printStackTrace();
        }
    }

    public static FsLogger getInstance() {
        if(instance == null) {
            instance = new FsLogger();
        }
        return instance;
    }

    public void info(String message) {
        logger.info(message);
    }

    public void warning(String message) {
        logger.warning(message);        
    }

    public void severe(String message) {
        logger.severe(message);
    }

Пример вызова регистратора:

private FsLogger logger = FsLogger.getInstance();
logger.severe(e1.getMessage());

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Из кода вы используете относительный путь Logs/LogFsForensics.log Это означает, что если текущий рабочий каталог, если процесс изменяет путь, будет недействительным.Когда это происходит, FileHandler создаст файл в расположении по умолчанию .Используйте абсолютный путь или укажите один из специальных компонентов FileHandler .Например:

/Logs/LogFsForensics.log как абсолютный путь или %h/Logs/LogFsForensics.log как относительный из домашнего каталога.

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

Глядя на код, я думаю, что вы хотите синхронизировать getInstance, чтобы никогда не пытаться создать более одного обработчика.

1 голос
/ 30 мая 2019

Я попытался выполнить ваш код и получить следующий вывод как в консоли, так и в файле:

May 30, 2019 12:35:11 PM io.yooksi.Main main
INFO: This is a test.
May 30, 2019 12:35:11 PM io.yooksi.FsLogger info
INFO: This is an info message
May 30, 2019 12:35:11 PM io.yooksi.FsLogger warning
WARNING: This is a warning
May 30, 2019 12:35:11 PM io.yooksi.FsLogger severe
SEVERE: This is a sever error message

Это означает, что в вашем коде нет ошибок, поэтому вы можете попробовать следующее:

  • Убедитесь, что следующий код правильно выводит на консоль:

    Logger logger = Logger.getLogger("test");
    logger.info("This is a test.");
    
  • Убедитесь, что файл не находится в только для чтения состояние.
  • Попробуйте вручную записать в файл, используя FileWriter или PrintWriter.

Если во время первого теста ничего не печатается на консоль, прочитайте следующий документ, гдеВы можете найти список распространенных причин, по которым Java регистратор не работает, и конкретные шаги по их устранению (по крайней мере, те, которые связаны с настройкой) :

ПочемуМой Java Logging не работает

...