2013-06-11 10 views
6

sto usando org.apache.log4j.Logger e ho spesso vedere le linee del mio log che assomigliano a questo:Ottenere più registri su una linea con 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 

Quello che mi aspetto di vedere è:

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 

Cioè, con più righe di registro stipate insieme su una riga e le informazioni di registro vengono sovrascritte. Non ho idea di cosa sto sbagliando, quindi mi piacerebbe sapere (A) se è qualcosa di ovvio o (B) qualsiasi suggerimento che può aiutarmi a risolvere questo.

La mia classe logger si presenta così:

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); 
     } 
    } 
} 

che uso in questo modo:

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

sto accedendo ~ 40.000 eventi al giorno, e le linee di circa 200 di questi hanno malformati, con qualsiasi cosa da 2 a 11 eventi separati per linea.

mio log4j.xml sembra liks questo:

<?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> 

Qualsiasi aiuto molto apprezzato.

+0

myLogger.info (String.Format (, "dati" "% s \ t% s \ t% s \ t% s", "dati" , "data", "data" + "\ n")); prova questo –

+1

@shreyanshjogi La nuova riga è già nel modello di registrazione ('% n'). – Jonathan

+1

potrebbe essere un problema con il buffering e l'accesso parallelo a un logger, provare a forzare il logger a svuotare dopo ogni operazione di registro aggiungendo: nel tag appender – gawi

risposta

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

provare il modello di cui sopra, senza \ t

O

+0

o se è necessario sostituire la scheda \ t con e provarlo. Secondo me% t è usato per visualizzare il nome del thread –

0

Utilizzare una classe come

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

Questo rimuoverà tutti \ n dalla stringa essere registrato e quindi aggiungere uno alla fine della linea.

E nel log4j uso di configurazione XML:

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