2013-08-12 4 views
6

В моем приложении много EJB. Текущая реализация Logger, созданная на заказ, создает такой журнал;Logback - как получить каждый журнал регистрации в отдельный файл журнала?

приватный статический логгер Logger = Logger.getInstance ("SERVICE_NAME");

, и регистрация будет занесена в файл;

(путь) /SERVICE_NAME/SERVICE_NAME.log

Я хочу повторить это поведение с Logback, но имеющих реальные проблемы, захватывая имя «регистратора» в конфигурации logback.xml. Это можно увидеть в log encoder.pattern, то есть «% d% -5level% logger {35} -% msg% n".

Любые идеи, как я могу получить это в свойство/переменную, а затем использовать его в элементе?

ответ

6

У меня есть частичное решение. Если я создаю свой собственный дискриминатор, я могу использовать Дискриминатор в файле logback.xml для реализации seperate-log-files-per-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

Вы можете вставить RollingFileAppender внутри SiftingAppender. – yayitswei

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

Edit: я заменил TimeBasedRollingPolicy с SizeAndTimeBasedRollingPolicy как предложено here. Для этого вам понадобится хотя бы logback 1.1.7.

Что вы получите с этим, это файл журнала для каждого созданного Logger. Каждый файл журнала будет выглядеть так: /var/log/loggername-2017-08-03.log.

Когда в файл было записано около 500 КБ, оно будет заархивировано как gz-zipfile в /var/log/loggername/08-2017/loggername-2017-08-03-0.log.gz.

0 в конце gz-zipfile-name является %i от <fileNamePattern> выше. Без %i он не будет работать. Не забудьте использовать <configuration debug=true> в logback.xml, если что-то не получится.

Смежные вопросы