Как создать файл журнала для каждой записи в определенном формате, используя среду ведения журнала утилит Java

Я хочу создать файл журнала для каждого запроса в формате ниже, используя ведение журнала Java.

YYYYMMDD_HHMMSS.log

Кто-нибудь, пожалуйста, дайте мне знать, как я могу добиться этого с помощью ведения журнала Java утилита?

1 ответ

Решение

FileHandler не поддерживает создание имен файлов по дате и времени из LogManager.

Если вы хотите сгенерировать имя файла при запуске, вы можете создать подкласс FileHandler и создать статический метод для генерации имени вашего файла, используя SimpleDateFormat. LogManager поддерживает опцию "config", которая также позволит вам установить пользовательский код для установки и установки FileHandler.

public class RollingFileHandler extends FileHandler {

    public RollingFileHandler() throws IOException {
        super(fileName(), 0, 1, true);
    }

    private static String fileName() {
        return new SimpleDateFormat("'%h'yyyyMMdd_HHmmss").format(new Date(System.currentTimeMillis()));
    }
}

Если вы хотите сгенерировать имя файла для каждой LogRecord, вы должны создать собственный обработчик, который будет создавать и закрывать FileHandler при каждой публикации.

public class DatedFileHandler extends Handler {

    @Override
    public synchronized void publish(LogRecord r) {
        if (isLoggable(r)) {
            try {
                FileHandler h = new FileHandler(fileName(r), 0, 1, true);
                try {
                    h.setLevel(getLevel());
                    h.setEncoding(getEncoding());
                    h.setFilter(getFilter());
                    h.setFormatter(getFormatter());
                    h.setErrorManager(getErrorManager());
                    h.publish(r);
                } finally {
                    h.close();
                }
            } catch (IOException | SecurityException jm) {
                this.reportError(null, jm, ErrorManager.WRITE_FAILURE);
            }
        }
    }

    @Override
    public void flush() {
    }

    @Override
    public void close() {
        super.setLevel(Level.OFF);
    }

    private String fileName(LogRecord r) {
        return new SimpleDateFormat("'%h'yyyyMMdd_HHmmss").format(new Date(r.getMillis()));
    }
}
Другие вопросы по тегам