2013-08-12 7 views
6

私のアプリケーションにはたくさんのEJBがあります。現在の特注のLogger実装は、このようなロガーを作成します。ログバック - 各ロガーを別々のログファイルにロギングする方法を教えてください。

プライベートスタティックロガーロガー= Logger.getInstance( "SERVICE_NAME");

となり、ログはファイルに保存されます。

(パス)

を/SERVICE_NAME/SERVICE_NAME.log私はlogbackで、この動作を複製したいのですが、本当のトラブルlogback.xml設定で「ロガー」の名前をつかむを持ちます。これは、log encoder.patternに見ることができます。つまり、 "%d%-5level%logger {35} - %msg%n"です。

どのように私はプロパティ/変数にこれを取得し、それを要素で使用することができますか?

答えて

6

私は部分的な解決策を持っています。独自のDiscriminatorを作成すると、logback.xmlのDiscriminatorを使用して、EJBごとに別々のログファイルを実装できます。

ディスクリミネータ;

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

}

その後、私の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> 

この解決策はうまくいくようですが、時間やサイズに基づいたログローテーションはありません。

+1

SiftingAppender内にRollingFileAppenderをネストできます。 – yayitswei

1

あなたの例のおかげで、異なるロガー出力を異なるファイルにルーティングするloggernameベースのディスクリミネータのソリューションを実装しました。ログバックのドキュメントは非常に冗長ですが、私はこの重要な情報を見つけることができませんでした。あなたは確かにすでにyayitsweiによって言及された解決策を見つけました。

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> 
[...] 

編集: 私は提案hereとしてSizeAndTimeBasedRollingPolicyでTimeBasedRollingPolicyを置き換えます。それには、少なくともログバック1.1.7が必要です。

これで得られるのは、作成された各ロガーのログファイルです。 すべてのログファイルは、/var/log/loggername-2017-08-03.logのようになります。

約500KBがファイルに書き込まれると、gz-zipファイルとして/var/log/loggername/08-2017/loggername-2017-08-03-0.log.gzにアーカイブされます。

gz-zipファイル名の最後の0は、上記の<fileNamePattern>%iです。 %iがなければ動作しません。何か動作しない場合は、logback.xmlに<configuration debug=true>を使用してください。