6

私のアプリケーションには多くの EJB があります。現在のオーダーメイドの Logger 実装では、次のようなロガーが作成されます。

private static Logger logger = Logger.getInstance("SERVICE_NAME");

、ログはファイルに記録されます。

(パス)/SERVICE_NAME/SERVICE_NAME.log

この動作を logback で再現したいのですが、logback.xml 構成で「ロガー」名を取得するのに本当に問題があります。これはログのencoder.pattern、つまり「%d %-5level %logger{35} - %msg %n」で確認できます。

これをプロパティ/変数に入れて要素で使用する方法はありますか?

4

2 に答える 2

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>

このソリューションは機能しているようですが、時間やサイズに基づくログ ローテーションがありません。

于 2013-08-23T08:16:42.260 に答える
1

あなたの例のおかげで、さまざまなロガー出力をさまざまなファイルにルーティングするロガー名ベースの識別子のソリューションを実装しました。logback のドキュメントは非常に冗長ですが、この重要な情報を見つけることができませんでした。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>
[...]

編集:ここで提案されているように、TimeBasedRollingPolicy を SizeAndTimeBasedRollingPolicy に置き換えました。そのためには、少なくとも logback 1.1.7 が必要です。

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

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

gz-zipfile-name の末尾の 0 は%i上記のもの<fileNamePattern>です。がない%iと機能しません。<configuration debug=true>何かが機能しない場合は、logback.xml で使用することを忘れないでください。

于 2017-04-05T13:53:56.547 に答える