Log4j2 не пишет в файл, пока не прервана программа Java - PullRequest
0 голосов
/ 19 сентября 2018

Я застрял в конфигурации Log4j2 XML некоторое время и не могу понять, как записать в файл приложениями RollingFile и RollingRandomAccessFile.

Когда я запускаю log4j2, он успешно инициализируется, записывает журнал в консоль с помощью приложения-консолии System.out.println ().Но когда я делаю tail -f logs/error.log или less logs/error.log, я не вижу этого в реальном времени.Но после того, как я kill -9 $jarpid сразу записывает в лог-файл, я вижу его в хвосте.Я думал, что хвост может заблокировать файл, но это не так.Я прочитал файл во время выполнения по nano logs/error.log, он был пуст, и текст появлялся там только после уничтожения процесса.Я упоминал, что это может быть потому, что я использую RollingRandomAccessFile, может быть, я испытываю эту «случайность».Но RollingFile действует так же.Я попытался написать сделать другой файл (кто знает, может быть, он уже используется другим приложением).То же самое.

Действительно запутался сейчас и не могу понять.

Вот мой log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Appenders>
        <RollingFile name="ErrorFile"
                                 fileName="logs/error.log"
                                 filePattern="logs/error-%d{MM-dd-yyyy}-%i.log.zip"
                                 immediateFlush="false"
                                 append="true"
                                 ignoreExceptions="false">
            <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%-5level] %d{dd.MM.yyyy HH:mm:ss} - %logger{36} - %msg%n" disableAnsi="false"/>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
    <Console name="Console" target="SYSTEM_OUT" follow="true" ignoreExceptions="true">
        <PatternLayout pattern="[%highlight{%-5level}] %d{dd.MM.yyyy HH:mm:ss} - %logger{36} - %msg%n" disableAnsi="false"/>
    </Console>
</Appenders>
    <Loggers>
        <Root level="all" includeLocation="false">
            <AppenderRef ref="ErrorFile"/>
        </Root>
    </Loggers>
</Configuration>

Вот мое приложение Java:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class test {
    public static Logger log = LogManager.getLogger(test.class);
    public static void main(String[] args) throws Exception{
        while (true) {
            log.debug("debug");
            log.error("error");
            System.out.println("JAR WORKS!"+System.currentTimeMillis());
            Thread.sleep(10000);
        }
    }
}

1 Ответ

0 голосов
/ 22 сентября 2018

В соответствии с log4j2 руководством параметр RollingFileAppender immediateFlush описывается следующим образом:

Если задано значение true - по умолчанию после каждой записи будет следоватьпромывать.Это гарантирует, что данные будут записаны на диск, но могут повлиять на производительность.

Сброс после каждой записи полезен только при использовании этого приложения с синхронными регистраторами.Асинхронные регистраторы и добавщики будут автоматически сбрасываться в конце пакета событий, даже если для InstantFlush задано значение false.Это также гарантирует, что данные записываются на диск, но более эффективно.

В вашей конфигурации для этого параметра установлено значение false, что означает, что данные не записываются на диск после каждой записи.Если вы хотите, чтобы после каждой записи следовал сброс на диск, установите вместо этого параметра значение true.

...