2013-06-11 6 views
6

Używam org.apache.log4j.Logger i ja często zobaczyć linie w moim dzienniku, które wyglądają tak:Getting wiele dzienników w jednej linii z log4j

2013-06-09T00:06:00,092 data data data dat2013-06-09T00:06:10,253 data data2013-06-09T00:06:16,202 data d2013-06-09T00:06:20,750 data data data data 

Czego spodziewać się:

2013-06-09T00:06:00,092 data data data data 
2013-06-09T00:06:10,253 data data data data 
2013-06-09T00:06:16,202 data data data data 
2013-06-09T00:06:20,750 data data data data 

Oznacza to, że z wieloma liniami logowanymi w jednym wierszu i nadpisanymi informacjami dziennika. Nie mam pojęcia, co robię źle, więc chciałbym wiedzieć (A), czy to coś oczywistego, czy (B) jakiekolwiek wskazówki, które mogą mi pomóc rozwiązać ten problem.

Moja klasa rejestrator wygląda następująco:

public class MyLogger { 
    private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger("com.example.mylog"); 

    public void info(String info){ 
     synchronized (log){ 
      log.info(info); 
     } 
    } 
} 

którego używam tak:

private CallsLogger callsLogger; 
/* ... */ 
myLogger.info(String.format("%s\t%s\t%s\t%s", "data", "data", "data", "data")); 

mam zalogowaniu ~ 40,000 imprez dziennie, a około 200 z nich malformed linie, z dowolnymi od 2 do 11 osobnych wydarzeń w linii.

Moja log4j.xml wygląda to liks:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/docs/api/org/apache/log4j/xml/log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="mylog" class="org.apache.log4j.rolling.RollingFileAppender"> 
     <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
      <param name="FileNamePattern" value="logs/mylog.log.%d.gz"/> 
     </rollingPolicy> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" 
        value="%d{yyyy-MM-dd'T'HH:mm:ss,SSS}\t%m%n"/> 
     </layout> 
    </appender> 
    <logger name="com.example.mylog" additivity="false"> 
     <level value="INFO"/> 
     <appender-ref ref="mylog"/> 
    </logger> 
    <root> 
     <priority value="ERROR"/> 
     <appender-ref ref="appender"/> 
    </root> 
</log4j:configuration> 

Każda pomoc mile widziana.

+0

myLogger.info (string.Format ("% s \ t% s \ t% s \ t% S", "dane", "dane" , "dane", "dane" + "\ n")); spróbuj tego –

+1

@shreyanshjogi Nowa linia jest już we wzorze rejestrowania ('% n'). – Jonathan

+1

może to być problem z buforowaniem i równoległym dostępem do programu rejestrującego, spróbuj wymusić wypalanie rejestru po każdej operacji dziennika, dodając: w znaczniku nadawcy – gawi

Odpowiedz

0
<param name="ConversionPattern" 
       value="%d{yyyy-MM-dd'T'HH:mm:ss,SSS} - %m%n"/> 

Spróbuj powyższy wzór bez \ t

lub

+0

lub jeśli potrzebujesz karty zastąp \ t z i spróbuj. Według mnie% t służy do wyświetlania nazwy wątku –

0

użycie klasy jak

public class MyPatternLayout extends PatternLayout { 
... 
public String format(LoggingEvent pEvent) { 
    return super.format(pEvent).replace('\n', ' ') + '\n'; 
} 
... 

zostanie usunięte wszystkie \ n z łańcucha być rejestrowane a następnie dodać jeden na końcu linii.

A w log4j wykorzystania konfiguracji XML:

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
... 
<layout class="....MyPatternLayout"> 
... 
</layout> 
</appender>