Я хотел бы настроить logback, чтобы сделать следующее.
У меня есть все это работающее за исключением последнего объекта, списка запуска. Кто-либо знает, как достигнуть этого? Вот конфигурация...
<appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg \(%file:%line\)%n</Pattern>
</layout>
<File>server.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>server.%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- keep 7 days' worth of history -->
<MaxHistory>7</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>50MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
Создайте свой собственный подкласс ch.qos.logback.core.rolling.TimeBasedRollingPolicy
и переопределите его start
public class MyPolicy
extends ch.qos.logback.core.rolling.TimeBasedRollingPolicy
{
public void start ( )
{
super.start( );
rollover( );
}
}
Переопределение метода isTriggeringEvent () в ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP должно работать нормально. Просто верните true при первом вызове метода isTriggeringEvent ().
Решение Ceki, похоже, не работает для меня, но похоже, по крайней мере, частично.
Он взрывается, потому что не может видеть текущую политику при запуске TimeBasedFileNamingAndTriggeringPolicyBase
. С помощью некоторого хакерства я получил его для ведения журнала, а с помощью еще нескольких я получил его для наблюдения за триггером, но затем он снова сломался, потому что не смог разрешить одно из свойств имени файла ... Пакет является пакетом для журнала, поэтому я может добраться до некоторых внутренних компонентов, чтобы воспроизвести часть логики в SizeAndTimeBasedFNATP # isTriggeringEvent
и вызвать computeCurrentPeriodsHighestCounterValue
. Я думаю, что что-то в этом роде может сработать, просто еще не нашел волшебной комбинации. Я действительно надеюсь, что делаю что-то глупое, потому что в противном случае я думаю, что это будет означать либо раскрытие некоторых деталей для создания подклассов, либо помещение их прямо в логбэк в качестве другой политики прокрутки / запуска.
logback.xml: пробовали различные упорядочения triggeringPolicy
, TimeBasedFileNamingAndTriggeringPolicy
внутри и вне RollingPolicy
.
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/${LOG_FILE_BASE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${LOG_FILE_BASE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<MaxHistory>7</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.RollOnStartupPolicy" />
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
Политика триггера:
package ch.qos.logback.core.rolling;
public class RollOnStartupPolicy<E> extends SizeAndTimeBasedFNATP<E> {
private final AtomicBoolean firstTime = new AtomicBoolean(true);
@Override
public boolean isTriggeringEvent(File activeFile, E event) {
if (!firstTime.get()) { // fast path
return false;
}
if (firstTime.getAndSet(false)) {
return true;
}
return false;
}
}
Исключение:
java.lang.NullPointerException
at at ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicyBase.start(TimeBasedFileNamingAndTriggeringPolicyBase.java:46)
at at ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP.start(SizeAndTimeBasedFNATP.java:36)
at at ch.qos.logback.core.joran... [snip joran config]