2014-05-23 6 views
6

Im przy log4j2 z następujących zależności:Log4j2 AsyncLogger z toczenia pliku appender nie pokazuje numer wiersza plik

treści
<!-- LOG4J2 --> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.0-rc1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.0-rc1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.lmax</groupId> 
     <artifactId>disruptor</artifactId> 
     <version>3.0.1</version> 
    </dependency> 

Log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="OFF"> 

<Appenders> 
    <Console name="CONSOLE" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" /> 
    </Console> 

    <!-- Generate rolling log for router with per hour interval policy --> 
    <RollingFile name="ProcessorRollingFile" fileName="D:/ocsprocessor.log" 
     filePattern="D:/ocsprocessor.log.%d{MM-dd-yyyy}-%i.log"> 
     <PatternLayout> 
     <pattern>%d{ISO8601} [%t] %p %c %L - %m%n</pattern> 
    </PatternLayout> 
     <Policies> 
      <TimeBasedTriggeringPolicy interval="1" /> 
     </Policies> 
     <DefaultRolloverStrategy max="24" /> 
    </RollingFile> 



    <!-- Register Async appender --> 
    <Async name="AsyncRollingFile"> 
     <AppenderRef ref="ProcessorRollingFile" /> 
    </Async> 
</Appenders> 

<Loggers> 
    <AsyncLogger name="com.tritronik.logger.log4j2" level="error" 
     additivity="false"> 
     <AppenderRef ref="AsyncRollingFile" /> 
    </AsyncLogger> 


</Loggers> 
</Configuration> 

okazać się, że wszystko poszło w porządku z wyjątkiem robi dzienniku Wyświetla numer linii rzucanego rejestratora (% L we wzorcu).

Wyszukałem go i dowiedziałem się, że dla asynchronicznego rejestratora i programu do przesyłania plików, nikt nie wspomniał o używaniu% L, więc jak mogę to osiągnąć? Czy też nie obsługuje% L?

Edit: Próbowałem dodany includeLocation = "true", ale same wyniki

2014-05-23 11:42:40,368 [threadPoolTaskExecutor-5] ERROR (AsyncLogger:) - THIS IS TEST MESSAGE FOR LOGGING TEST PURPOSE 

Dzięki

Odpowiedz

9

Najpierw wyjmij appender Async i skieruj appender-ref z bezpośrednio do AsyncLogger do ProcessorLoggingFile. Po drugie, musisz dodać includeLocation = "true" na AsyncLogger.

Posiadanie asynchronicznego programisty oprócz asynchronicznego programu rejestrującego nie pomaga iw tym przypadku może być tym, co uniemożliwia działanie funkcji locationLocation.

+0

Dziękujemy! To działa .. Ale uhm, jak posiadanie asynchronicznego appendera jest nie nie oprócz loginu asyn? – Lynx777

+2

Jeśli twoja aplikacja loguje się do rejestratora asynchronicznego, to po prostu umieszcza zdarzenia w dzienniku w kolejce (przerywacz LMAX). Oddzielny wątek usunie zdarzenia z kolejki i wyśle ​​je do aplikanta. Jeśli appender jest asynchroniczny, zdarzenie jest ponownie umieszczane w kolejce. W końcu wątek aplikacji asynchronicznej usunie zdarzenie z tej kolejki i zapisze w pliku. Tak więc jeden z nich jest niepotrzebny. AsyncLoggers są znacznie szybsze, więc polecam usunąć asynchronicznego programistę. Ponadto, jeśli zachowasz oba potrzebne includeLocation dla obu (nie wiesz, czy to by działało, nie przetestowane ...) –

Powiązane problemy