Как 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) {
}
}