Как Log4j2 RollingFile Delete IfAccumulatedFileCount считает файлы?

Есть следующая конфигурация log4j с помощью yaml:

Configuration:
  name: Default
  Properties:
    Property:
      name: log-path
      value: "logs"
  Appenders:
    RollingFile:
      -
        name: File_Appender
        fileName: ${log-path}${sys:file.separator}app.log
        PatternLayout:
          pattern: "%-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{3}: %3L - %m %n"
        filePattern: ${log-path}${sys:file.separator}archive${sys:file.separator}app-%d{yyyy-MM-dd-HH.mm.ss}-%i.log.gz
        Policies:
          SizeBasedTriggeringPolicy:
            size: 10KB
        DefaultRollOverStrategy:
            max: 5
            Delete:
              basePath: ${log-path} #${sys:file.separator}archive
              maxDepth: 3
              IfFileName:
                glob: "*/app-*.log.gz"
              IfAccumulatedFileCount:
                exceeds: 5
      -
        name: File2_Appender
        fileName: ${log-path}${sys:file.separator}app2.log
        PatternLayout:
          pattern: "%-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{3}: %3L - %m %n"
        filePattern: ${log-path}${sys:file.separator}archive${sys:file.separator}app2-%d{yyyy-MM-dd-HH.mm.ss}-%i.log.gz
        Policies:
          SizeBasedTriggeringPolicy:
            size: 10KB
        DefaultRollOverStrategy:
          max: 5
          Delete:
            basePath: ${log-path} #${sys:file.separator}archive
            maxDepth: 3
            IfFileName:
              glob: "*/app2-*.log.gz"
            IfAccumulatedFileCount:
              exceeds: 1
      -
        name: File3_Appender
        fileName: ${log-path}${sys:file.separator}app3.log
        PatternLayout:
          pattern: "%-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{3}: %3L - %m %n"
        filePattern: ${log-path}${sys:file.separator}archive${sys:file.separator}app3-%d{yyyy-MM-dd-HH.mm.ss}-%i.log.gz
        Policies:
          SizeBasedTriggeringPolicy:
            size: 10KB
        DefaultRollOverStrategy:
          max: 5
          Delete:
            basePath: ${log-path} #${sys:file.separator}archive
            maxDepth: 3
            IfFileName:
              glob: "*/app3-*.log.gz"
            IfAccumulatedFileCount:
              exceeds: 3               
  Loggers:
    Root:
      level: all
      AppenderRef:
        - ref: File_Appender
          level: debug

    Logger:
      -
        name: Logger2
        additivity: false
        AppenderRef:
          - ref: File2_Appender
      -
        name: Logger3
        additivity: false
        AppenderRef:
          - ref: File3_Appender

Конфигурация описывает 3 Logger-a, каждый из который пишет в свой файл, отличаются эти RollingFile Appender-ы только названиями файлов и опцией

IfAccumulatedFileCount:
  exceeds: n (n = 5, 1 и 3)

В документации сказано, что опция работает следующим образом

IfAccumulatedFileCount - accepts paths after some count threshold is exceeded during the file tree walk.

Как я понимаю должно было посчитаться количество вообще всех файлов в заданной папке, но видимо это не так и на участвующие в подсчёте файлы как-то влияет соседняя опция IfFileName, поскольку после работы приложения с данной концигурацией остаётся ровно 5, 1 и 3 файлов соответвующих каждому из Appender-ов.

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

If conditions are not nested they may be evaluated in any order.

но я не думаю, что из этого как-то следует то, что одна может влиять на значение другой.

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

P.S.

Если в конфигурации поменять местами опции IfFileName и IfAccumulatedFileCount, то количество удаляемых (оставшихся) файлов вообще становится непредсказуемо.

Для правильной работы в конкретно моём случае опции надо вложить друг в друга, но меня интересует их совместная работа если они именно не вложенные, а находятся на одном уровне.

P.P.S.

Для теста можно использовать простой вывод а-ля:

for (int j = 0; j < 3; j++) {
    for (int i = 0; i < 1000; i++) {
        log3.info("значение: " + (j * 1000 + i));
    }
    for (int i = 0; i < 1000; i++) {
        log2.info("значение: " + (j * 1000 + i));
    }
    for (int i = 0; i < 1000; i++) {
        log.info("значение: " + (j * 1000 + i));
    }

    try {
        Thread.sleep(1000);
    } catch (Exception ignore) {
    }
}

Ответы (0 шт):