2013-08-12 28 views
6

Ứng dụng của tôi có nhiều EJB. Việc thực hiện Logger bespoke hiện tại tạo ra một logger như thế này;Logback - làm thế nào để có được mỗi logger đăng nhập vào một tập tin đăng nhập riêng biệt?

riêng tĩnh Logger logger = Logger.getInstance ("SERVICE_NAME");

và quá trình ghi nhật ký sẽ chuyển thành tệp;

(đường dẫn) /SERVICE_NAME/SERVICE_NAME.log

Tôi muốn tái tạo hành vi này với logback, nhưng gặp khó khăn trong thực grabbing tên 'logger' trong cấu hình logback.xml. Nó có thể được nhìn thấy trong log encoder.pattern, ví dụ: "% d% -5level% logger {35} -% msg% n".

Bất kỳ ý tưởng nào về cách tôi có thể đưa điều này vào thuộc tính/biến và sau đó sử dụng nó trong phần tử?

Trả lời

6

Tôi có một giải pháp một phần. Nếu tôi tạo Discriminator riêng của mình, thì tôi có thể sử dụng Discriminator trong tệp logback.xml để thực hiện riêng biệt-log-files-per-EJB.

Phân biệt đối xử;

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

}

Sau đó logback.xml của tôi;

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

Giải pháp này có vẻ hiệu quả nhưng hiện tại tôi không có thời gian hoặc kích thước xoay vòng đăng nhập!

+1

Bạn có thể lồng một RollingFileAppender bên trong SiftingAppender. – yayitswei

1

Nhờ ví dụ của bạn, tôi đã triển khai giải pháp cho một phân biệt đối xử dựa trên nhật ký điều hướng đầu ra trình ghi khác nhau cho các tệp khác nhau. Mặc dù tài liệu về logback rất dài nhưng tôi không thể tìm thấy thông tin cần thiết này. Bạn chắc chắn đã tìm được giải pháp được đề cập bởi yayitswei rồi.

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: tôi thay TimeBasedRollingPolicy với SizeAndTimeBasedRollingPolicy như đề xuất here. Bạn sẽ cần ít nhất logback 1.1.7 cho điều đó.

Những gì bạn nhận được với điều này, là một logfile cho mỗi Logger tạo ra. Mọi tệp nhật ký sẽ trông giống như sau: /var/log/loggername-2017-08-03.log.

Khi khoảng 500KB được ghi vào tệp, tệp sẽ được lưu trữ dưới dạng tệp gz-zipfile vào /var/log/loggername/08-2017/loggername-2017-08-03-0.log.gz.

0 ở cuối tên gz-zipfile là %i từ số <fileNamePattern> ở trên. Nếu không có %i nó sẽ không hoạt động. Hãy nhớ sử dụng <configuration debug=true> trong logback.xml nếu có điều gì đó không hoạt động.

Các vấn đề liên quan