検索条件
全2件
(1/1ページ)
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/hoge.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>./logs/hoge.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger\(%F[%L]\) - %msg %n</pattern>
<charset>Shift_JIS</charset>
</encoder>
</appender>
調べてみると、logbackのSizeBasedTriggeringPolicyはI/O負荷対策のためファイルサイズを毎度チェックしにいかない。デフォルトでは16回に1回であり、16回ログ出力して初めてサイズチェックに行く。ログ出力の頻度が多いと間隔を開け、頻度が少ないと間隔を狭める。
<triggeringPolicy class="foo.bar.CustomSizeBasedTriggeringPolicy">
[カスタムクラス]
package foo.bar;
import java.io.File;
import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
import ch.qos.logback.core.util.FileSize;
public class CustomSizeBasedTriggeringPolicy<E> extends SizeBasedTriggeringPolicy<E> {
String maxFileSizeAsString = Long.toString(DEFAULT_MAX_FILE_SIZE);
FileSize maxFileSize;
public CustomSizeBasedTriggeringPolicy() {
}
public CustomSizeBasedTriggeringPolicy(final String maxFileSize) {
setMaxFileSize(maxFileSize);
}
@Override
public boolean isTriggeringEvent(final File activeFile, final E event) {
//オリジナルのisTriggeringEventでは発火しないことがあるため、ログ書き出しごとにチェックする
return (activeFile.length() >= maxFileSize.getSize());
}
@Override
public String getMaxFileSize() {
return maxFileSizeAsString;
}
@Override
public void setMaxFileSize(String maxFileSize) {
this.maxFileSizeAsString = maxFileSize;
this.maxFileSize = FileSize.valueOf(maxFileSize);
}
}
isTriggeringEventだけいじったクラスを作成してやって、logback.xmlでそちらを見るようにしてやる。exec java -Dpid=$$ -jar /foo/bar.jar[logback.xml]
<pattern>%d{yyyy/MM/dd HH:mm:ss} [${pid}] %level %msg%n</pattern>
-Dpid=$$で、プロパティ:pidにプロセスIDをセット、patternに${pid}と記述してやるとlobackの機能で出力できる。java -Dpid=$$ -jar /foo/bar.jarWebアプリケーションで動いている場合は、何がしかプロセスIDに相当するものがSystemPropertyにいると思うので${}でそれを拾えばいい(はず)。