Util logging не удаляет старые файлы журналов при ротации.

Я использовал приведенный ниже код для настройки ведения журнала.

public Boolean configureLogPath(String logPath, String level, String logComponents, int logFileSize,
        int logFileCount) {
    int logFileSizeInKbs = logFileSize * 1000;
    Boolean result = false;
    String[] splitComponents = logComponents.split(",");
    for (String component : splitComponents) {
        loggableComponents.add(component);
    }
    switch (level) {
    case "info":
        LOGGER.setLevel(Level.INFO);
        break;
    case "severe":
        LOGGER.setLevel(Level.SEVERE);
        break;
    case "debug":
        LOGGER.setLevel(Level.CONFIG);
        break;
    case "off":
        LOGGER.setLevel(Level.OFF);
        break;
    default:
        LOGGER.setLevel(Level.SEVERE);
    }
    try {
        simpleFormatter = new SimpleFormatter();
        logFileHandler = new FileHandler(logPath, logFileSizeInKbs, logFileCount);
        logFileHandler.setFormatter(simpleFormatter);
        LOGGER.setFilter(filter);

        LOGGER.addHandler(logFileHandler);
        result = true;
    } catch (SecurityException e1) {
        result = false;
        LOGGER.log(Level.SEVERE, "Security exception when reading log file" + e1);
    } catch (IOException e1) {
        result = false;
        LOGGER.log(Level.SEVERE, "IO Exception when reading log file" + e1);
    }
    return result;
}

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


person AnOldSoul    schedule 22.12.2015    source источник


Ответы (1)


Является ли это поведением ведения журнала утилиты или я могу что-то сделать, чтобы удалить старые файлы во время ротации?

Согласно документации FileHandler:

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

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

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

private boolean constructed;
@Override
protected synchronized void setOutputStream(OutputStream out) throws SecurityException {
    super.setOutputStream(out);
    if (constructed && Level.OFF.equals(super.getLevel())) { //Rotating...
         deleteRotatedFiles();
    }
    constructed = true;
}
person jmehrens    schedule 22.12.2015
comment
Разве это условие не удалит файлы, если я вручную отключу журналы? То есть, если мои журналы все еще не достигли количества ротации, и если я хочу остановить ведение журнала, я бы установил уровень журнала текущих журналов на Off. Так не удалит ли это журнал, который в настоящее время используется? - person AnOldSoul; 23.12.2015
comment
Для недавно созданного FileHandler это будет. Это не так сложно обойти, так как вы можете установить уровень 2147483646 вместо OFF. Или FileHandler может быть изменен, чтобы отслеживать, что это не первый вызов. - person jmehrens; 23.12.2015