У меня есть приложение, работающее как 2 экземпляра в Tomcat, скажем, клиент и сервер, я должен записать активность пользователя вошедшего в систему пользователя в уникальный файл, специфичный для такого пользователя, как john.log. Я смог добиться этого, используя маршрутизацию в Log4j2 и указав расположение файла журнала log4j2 в обоих приложениях на один и тот же каталог.
Здесь возникает проблема, когда я пытаюсь переворачивать файл журнала каждый день ночью / каждые 1 час, его исключение выдает, сообщая, что к файлу обращалась другая программа.
Когда я попытался записать журнал отдельно, а не в один файл, он работает нормально и переворачивается в соответствии с условием cron, но при указании на тот же каталог и доступе к одному и тому же файлу при перекатывании возникает исключение при переворачивании.
Я использовал последнюю версию Log4j2 "2.11.2"
XML-файл клиента Log4j
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration status="WARN" name="MyApp-Client" monitorInterval="30">
<Properties>
<!-- Log File location-->
<Property name="BaseDir">C:\\Log_Files\webapp</Property>
<!-- Log pattern -->
<Property name="pattern">[%-5level] [%d] [%c{1}] - %msg%n</Property>
<!-- Routing File -->
<Property name="RoutFileName">${BaseDir}\${ctx:logFileName}.log</Property>
<Property name="RoutFilePattern">${BaseDir}\${ctx:logFileName}-%d{yyyy-MM-dd}-%i.log</Property>
<!-- CRON pattern -->
<Property name="Roll_perminute">0 * * * * ?</Property>
<Property name="Roll_Daily">0 0 0 * * ?</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${pattern}" />
</Console>
<Routing name="USERLEVEL">
<Routes pattern="$${ctx:logFileName}">
<Route>
<RollingFile name="Rolling-${ctx:logFileName}" append="true" fileName="${RoutFileName}" filePattern="${RoutFilePattern}">
<PatternLayout pattern="Client-LOG: ${pattern}" />
<Policies>
<CronTriggeringPolicy schedule="${Roll_perminute}" evaluateOnStartup="true"/>
</Policies>
</RollingFile>
</Route>
<Route ref="Console" key="${ctx:logFileName}" />
</Routes>
</Routing>
</Appenders>
<Loggers>
<Logger name="com.myapp" level="ALL" additivity="false">
<Appender-Ref ref="USERLEVEL" level="ALL" />
</Logger>
<Root level="ALL" additivity="false">
<Appender-Ref ref="Console" level="ALL" />
</Root>
</Loggers>
</Configuration>
Сервер Log4j xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration status="WARN" name="MyApp-Server" monitorInterval="30">
<Properties>
<!-- Log File location-->
<Property name="BaseDir">C:\\Log_Files\webapp</Property>
<!-- Log pattern -->
<Property name="pattern">[%-5level] [%d] [%c{1}] - %msg%n</Property>
<!-- Routing File -->
<Property name="RoutFileName">${BaseDir}\${ctx:logFileName}.log</Property>
<Property name="RoutFilePattern">${BaseDir}\${ctx:logFileName}-%d{yyyy-MM-dd}-%i.log</Property>
<!-- CRON pattern -->
<Property name="Roll_perminute">0 * * * * ?</Property>
<Property name="Roll_Daily">0 0 0 * * ?</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${pattern}" />
</Console>
<Routing name="USERLEVEL">
<Routes pattern="$${ctx:logFileName}">
<Route>
<RollingFile name="Rolling-${ctx:logFileName}" append="true" fileName="${RoutFileName}" filePattern="${RoutFilePattern}">
<PatternLayout pattern="SERVER-LOG: ${pattern}" />
<Policies>
<CronTriggeringPolicy schedule="${Roll_perminute}" evaluateOnStartup="true"/>
</Policies>
</RollingFile>
</Route>
<Route ref="Console" key="${ctx:logFileName}" />
</Routes>
</Routing>
</Appenders>
<Loggers>
<Logger name="com.myapp" level="ALL" additivity="false">
<Appender-Ref ref="USERLEVEL" level="ALL" />
</Logger>
<Root level="ALL" additivity="false">
<Appender-Ref ref="Console" level="ALL" />
</Root>
</Loggers>
</Configuration>
Ошибка сгенерирована
2019-05-31 19:43:00,021 Log4j2-TF-3-Scheduled-4 ERROR Unable to move file C:\\Log_Files\webapp\User1.log to C:\\Log_Files\webapp\User1-2019-05-31-1.log: java.nio.file.FileSystemException C:\\Log_Files\webapp\User1.log -> C:\\Log_Files\webapp\User1-2019-05-31-1.log: The process cannot access the file because it is being used by another process.
2019-05-31 19:43:00,026 Log4j2-TF-3-Scheduled-4 ERROR Unable to delete file C:\\Log_Files\webapp\User1.log: java.nio.file.FileSystemException C:\\Log_Files\webapp\User1.log: The process cannot access the file because it is being used by another process.
Исходя из выданной ошибки, я понимаю, что при переключении все еще выполняется доступ к файлу журнала любым экземпляром регистратора. Но как мы можем безопасно перевернуться при таком условии, я что-то не так делаю в конфигурации. Есть ли у нас другие варианты в log4j2 для достижения этого