Использование Logger с ограничением размера и количества файлов - PullRequest
0 голосов
/ 26 марта 2020

Мне было интересно, может ли кто-нибудь помочь мне с этим вопросом. Мой текущий код настроен, чтобы использовать Logger в java .util.logging, мы записываем журнал в один файл, а когда нам нужен доступ к журналу, мы просто читаем файл.

    String filename = name + ".log";
    Logger logger = Logger.getLogger(name);
    logger.setLevel(Level.ALL);
    final FileHandler fileHandler = new FileHandler(filename, true);
    final SimpleFormatter formatter = new LogFormatter();
    fileHandler.setFormatter(formatter);
    logger.addHandler(fileHandler);

Содержимое журнала затем получается

    Files.readAllLines(Paths.get(filename));

Возникла проблема, когда размер файла может стать слишком большим, и поэтому я хочу ограничить его. Читая документацию, я могу сделать следующее:

    final FileHandler fileHandler = new FileHandler(filename, 1000000, 3, true);

Это создаст до трех файлов размером 1 МБ, циклически перебирая, когда заполнится третий, очистив первый файл и записав оттуда снова. Это идеальное решение, но в нем есть две проблемы, которые я не знаю, как решить.

Во-первых, есть ли простой способ найти имя всех созданных файлов? (Точнее, есть ли простой способ сделать это? Я ценю, что могу просто искать имя файла.0, имя файла.1 ... до предела).

Во-вторых, как мне найти " активный "файл. Пример. Допустим, один цикл уже завершен и имеется три файла («file.0», «file.1», «file.2»). Если регистратор в данный момент пишет в файл.1, как мне это определить, поэтому, когда я создаю журнал как список, верхняя часть журнала - это самое старое содержимое (в этом примере файл.2)

Спасибо Вам за любой ответ.

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Во-первых, существует ли простой способ найти имя всех созданных файлов? (Точнее, есть ли простой способ сделать это? Я ценю, что могу просто искать имя файла.0, имя файла.1 ... до предела).

Нет, но есть поданные RFE предоставить эту информацию. См .: Как вывести имя текущего java .util.logging.Logger имени файла журнала?

Во-вторых, как мне найти "активный" файл? Пример. Допустим, один цикл уже завершен и имеется три файла («file.0», «file.1», «file.2»). Если регистратор в данный момент пишет в файл.1, как мне это определить, поэтому, когда я создаю журнал как список, верхняя часть журнала является самым старым содержимым (файл.2 в этом примере)

Согласно исходному коду для FileHandler :: rotate , файлы журналов поворачиваются вниз и сбрасываются с конца. Поэтому нулевая позиция всегда является активным файлом.

0 голосов
/ 26 марта 2020

Хорошо, я разработал решение, которое достаточно просто, и я достаточно доволен им. Как упоминал jmehrens, прямого пути нет, но я решил опубликовать его здесь на тот случай, если у кого-то возникнет такая же проблема. на ранее определенный каталог. Сортировка по дате последнего изменения, а затем чтение всех строк.

final List<File> logFiles = Arrays.asList(directory.listFiles(filter));
logFiles.sort((file0, file1) -> {
    final Long date1 = file0.lastModified();
    final Long date2 = file1.lastModified();
    return date1.compareTo(date2);
});
// Iterate through logFiles and read the lines
...