Как правильно, чтобы закрыть FileHandler из другого метода - PullRequest
0 голосов
/ 14 декабря 2018

Цель

В настоящее время я регистрирую некоторые ловушки SNMP с помощью встроенного метода ведения журналов Java.

Моя проблема

Проблема в том, что я запускаю свой FileHandler в конструкторе моего файла "Logging".Хотя сама запись ведется внутри метода вне конструктора.

Поэтому я не знаю, как правильно закрыть FileHandler после того, как журнал произошел, потому что сам регистратор открывается внутри конструктора.-> Ошибка, которая возникает в результате этого, заключается в том, что моя регистрация создает файлы, такие как "log.txt", log1.txt "," log2.txt "...

Что я пробовал

Я пытался закрыть FileHandler внизу моего конструктора ... очевидно, что это не сработало. Также я пытался закрыть его из метода, где происходит сам журнал. Проблема здесья не имею доступа к экземпляру обработчика.

Код регистратора

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class Logging {
    private Logger log = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

    public Logging() {
        Logger root = Logger.getLogger("");
        FileHandler txt = null;
        try {
            txt = new FileHandler("log.txt", true);
        }       
        catch(SecurityException | IOException e) {
            e.printStackTrace();
        }
        root.setLevel(Level.ALL);
        txt.setFormatter(new Formatter() {

            @Override
            public String format(LogRecord record) {
                String ret = "";
                /*
                if(record.getLevel().intValue() >= Level.WARNING.intValue()) {
                    ret += "Error: ";
                }
                */
                SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy | HH:mm");
                Date d = new Date(record.getMillis());
                ret += df.format(d);

                ret += this.formatMessage(record);
                return ret;
            }
        });
        root.addHandler(txt);
    }

    public void addMessage(String message, String type) {
        if(type == "warning") {
            log.warning(message);
        }
    }
}

Спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вам не нужно закрывать FileHandler, LogManager сделает это за вас, если вы добавили его в Logger, что вы и сделали.

LogManager использует ловушку отключения для закрытия всех обработчиков, здесьэто реализация из openjdk:

// This private class is used as a shutdown hook.
// It does a "reset" to close all open handlers.
private class Cleaner extends Thread {

    private Cleaner() {
        /* Set context class loader to null in order to avoid
         * keeping a strong reference to an application classloader.
         */
        this.setContextClassLoader(null);
    }

    @Override
    public void run() {
        // This is to ensure the LogManager.<clinit> is completed
        // before synchronized block. Otherwise deadlocks are possible.
        LogManager mgr = manager;

        // If the global handlers haven't been initialized yet, we
        // don't want to initialize them just so we can close them!
        synchronized (LogManager.this) {
            // Note that death is imminent.
            deathImminent = true;
            initializedGlobalHandlers = true;
        }

        // Do a reset to close all active handlers.
        reset();
    }
}

Вы также можете использовать ловушку отключения, если хотите управлять закрытием файлов в конце вашего приложения.

0 голосов
/ 14 декабря 2018

Попробуйте, и вы можете пройти, Примеры для java.util.logging.FileHandler ?

public synchronized static Logger getLogger(){
  if (null != logger) {
    return logger;
  }
  logger=Logger.getLogger("TokenVendingMachineLogger");
  FileHandler handler;
  try {
    handler=new FileHandler("MyLogFile.txt",true);
    SimpleFormatter formatter=new SimpleFormatter();
    handler.setFormatter(formatter);
    logger.addHandler(handler);
    logger.setLevel(Level.ALL);
  }
 catch (  SecurityException e) {
    System.err.println("Security exception while initialising logger : " + e.getMessage());
  }
catch (  IOException e) {
    System.err.println("IO exception while initialising logger : " + e.getMessage());
  }
  return logger;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...