Log4j2 не удалось пролонгировать, если один и тот же файл журнала использовался двумя разными приложениями - PullRequest
0 голосов
/ 31 мая 2019

У меня есть приложение, работающее как 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 для достижения этого

...