2013-08-12 23 views
6

La mia applicazione ha molti EJB. L'attuale implementazione di Logger su misura crea un logger come questo;Logback - come ottenere che ogni logger effettui il log in un file di registro separato?

logger Logger statico privato = Logger.getInstance ("SERVICE_NAME");

e la registrazione verrà inserita in un file;

(percorso) /SERVICE_NAME/SERVICE_NAME.log

voglio replicare questo comportamento con logback, ma avendo difficoltà reale afferrando il nome di 'logger' nella configurazione logback.xml. Può essere visto nel log encoder.pattern, ad esempio "% d% -5level% logger {35} -% msg% n".

Qualche idea su come ottenerlo in una proprietà/variabile e quindi usarlo nell'elemento?

risposta

6

Ho una soluzione parziale. Se creo il mio Discriminator, posso quindi utilizzare il Discriminator nel logback.xml per implementare seperate-log-files-per-EJB.

Discriminatore;

public class LoggerNameBasedDiscriminator implements Discriminator<ILoggingEvent> { 

private static final String KEY = "loggerName"; 

private boolean started; 

@Override 
public String getDiscriminatingValue(ILoggingEvent iLoggingEvent) { 
    return iLoggingEvent.getLoggerName(); 
} 

@Override 
public String getKey() { 
    return KEY; 
} 

public void start() { 
    started = true; 
} 

public void stop() { 
    started = false; 
} 

public boolean isStarted() { 
    return started; 
} 

}

Poi la mia logback.xml;

<configuration debug="true" scan="true" scanPeriod="30 seconds"> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg</pattern> 
    </encoder> 
    </appender> 

    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
    <discriminator class="package.to.LoggerNameBasedDiscriminator"/> 
    <sift> 
     <appender name="FILE-${loggerName}" class="ch.qos.logback.core.FileAppender"> 
    <FILE>path/to/logs/${loggerName}/${loggerName}.log</FILE> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} %-50(%level %logger{35}) %msg%n</pattern> 
    </encoder> 
     </appender> 
    </sift> 
    </appender> 

    <root level="debug"> 
    <appender-ref ref="STDOUT" /> 
    <appender-ref ref="SIFT" /> 
    </root> 
</configuration> 

Questa soluzione sembra funzionare, ma ora non ho tempo o dimensione di rotazione del registro basata!

+1

È possibile nidificare un RollingFileAppender all'interno di SiftingAppender. – yayitswei

1

Grazie al tuo esempio ho implementato una soluzione per un discriminatore basato su un logger che instrada diversi output del logger in file diversi. Sebbene la documentazione di logback sia così prolissa, non sono riuscito a trovare queste informazioni essenziali. Hai sicuramente trovato la soluzione menzionata da yayitswei già.

logback.xml:

[...] 
<timestamp key="startTimestamp" datePattern="yyyy-MM-dd"/> 
<timestamp key="folderTimestamp" datePattern="MM-yyyy"/> 

<property name="LOGDIR" value="/var/log/spock" /> 

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"> 
    <discriminator class="com.enterprise.spock.LoggerNameBasedDiscriminator" /> 
    <sift> 
     <appender name="FILE-${loggerName}" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
      <file>${LOGDIR}/${loggerName}-${startTimestamp}.log</file> 
      <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 
       <fileNamePattern>${LOGDIR}/${folderTimestamp}/${loggerName}-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern> 
       <maxFileSize>500KB</maxFileSize> 
       <maxHistory>100</maxHistory> 
       <totalSizeCap>50MB</totalSizeCap> 
      </rollingPolicy> 
      <encoder> 
       <charset>UTF-8</charset> 
       <pattern>%level %date{HH:mm:ss.SSS}: %msg %n</pattern> 
      </encoder> 
     </appender> 
    </sift> 
</appender> 
[...] 

Edit: ho sostituito con TimeBasedRollingPolicy SizeAndTimeBasedRollingPolicy come proposto here. Avrai bisogno almeno del logback 1.1.7 per quello.

Ciò che si ottiene con questo, è un file di registro per ogni Logger creato. Ogni file di registro sarà simile a questo: /var/log/loggername-2017-08-03.log.

Quando circa 500 KB sono stati scritti nel file, verrà archiviato come file zip in /var/log/loggername/08-2017/loggername-2017-08-03-0.log.gz.

Lo 0 alla fine del nome gz-zipfile è %i dallo <fileNamePattern> precedente. Senza lo %i non funzionerà. Ricordati di usare <configuration debug=true> in logback.xml se qualcosa non funziona.

Problemi correlati