2010-03-21 30 views
108

Tôi đang sử dụng logback/slf4j để ghi nhật ký của mình. Tôi muốn phân tích tệp nhật ký của mình để phân tích một số dữ liệu, vì vậy thay vì phân tích cú pháp một tệp lớn lớn (chủ yếu bao gồm các câu lệnh gỡ rối), tôi muốn có hai bản ghi nhật ký mà mỗi đăng nhập vào một tệp riêng biệt; một cho phân tích và một cho tất cả các mục đích đăng nhập. Có ai biết nếu điều này là có thể với Logback, hoặc bất kỳ logger khác cho rằng vấn đề?Đăng nhập để ghi các thông điệp khác nhau vào hai tệp

Trả lời

223

Rất có thể thực hiện điều gì đó như thế này trong quá trình đăng xuất. Dưới đây là một cấu hình ví dụ:

<?xml version="1.0"?> 
<configuration> 
    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
     <file>logfile.log</file> 
     <append>true</append> 
     <encoder> 
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
     </encoder> 
    </appender> 
    <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender"> 
     <file>analytics.log</file> 
     <append>true</append> 
     <encoder> 
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
     </encoder> 
    </appender> 
    <!-- additivity=false ensures analytics data only goes to the analytics log --> 
    <logger name="analytics" level="DEBUG" additivity="false"> 
     <appender-ref ref="ANALYTICS-FILE"/> 
    </logger> 
    <root> 
     <appender-ref ref="FILE"/> 
    </root> 
</configuration> 

Sau đó, bạn muốn thiết lập hai logger riêng biệt, một cho tất cả mọi thứ và có để đăng nhập dữ liệu phân tích như sau:

Logger analytics = LoggerFactory.getLogger("analytics"); 
+1

tôi cần phải làm điều này loại điều để tôi có thể có một appender không-line-thức ăn và một appender thường xuyên để cùng một tập tin. Cảm ơn thông tin này. – djangofan

+0

IMO additivity = false phải là mặc định nếu chỉ định appender-ref khác nhau. Rất thường xuyên, chúng tôi nhận được ứng dụng trong đó một số mô-đun sẽ là máy phát nhật ký rất thường xuyên do một số sự kiện hẹn giờ và chúng tôi muốn tách các nhật ký đó thành các tệp khác nhau. Ghi nhật ký tương tự trong 10 tệp khác nhau thực sự không có ý nghĩa. Vì vậy, nó phải là một lựa chọn trong tính năng không mặc định. Kể từ khi đăng nhập được viết lại cùng một sai lầm nên đã được sửa chữa bởi cùng một tác giả. –

+0

Tôi muốn đăng nhập lỗi, gỡ lỗi, thông báo thông tin trong các tệp khác nhau tương ứng. Có thể với logback.xml – Qasim

1

trong trường hợp của tôi, tôi muốn rời khỏi tên lớp như đăng nhập tên

private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class); 

và như tôi đã có vài lớp học như vậy, vì vậy tôi logbook.xml

<!--additivity=false ensures this log data only goes to the this log, and no one more --> 
<logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false"> 
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/> 
</logger> 
<logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false"> 
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/> 
</logger> 
<logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false"> 
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/> 
</logger> 
1

Bạn có thể có bao nhiêu logger như bạn muốn. Tuy nhiên, tốt hơn bạn nên có một gói cho mỗi gói mà bạn cần đăng nhập khác nhau. Sau đó tất cả các lớp trong gói đó và các gói con của nó sẽ nhận được trình ghi cụ thể đó. Tất cả chúng đều có thể chia sẻ logger gốc và gửi dữ liệu nhật ký của chúng tới trình tạo logger gốc bằng cách sử dụng additivity = "true". Dưới đây là một ví dụ:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 

<property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36} 
%X{akkaSource} [%file:%line] - %m%n" /> 

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern> 
    </encoder> 
</appender> 

<appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${catalina.base}/logs/worker.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern> 
     <maxHistory>360</maxHistory> 
    </rollingPolicy> 
    <encoder> 
     <pattern>${pattern}</pattern> 
    </encoder> 
</appender> 

<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${catalina.base}/logs/transformer.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern> 
     <maxHistory>360</maxHistory> 
    </rollingPolicy> 
    <encoder> 
     <pattern>${pattern}</pattern> 
    </encoder> 
</appender> 

<logger name="com.xxx.yyy.zzz" level="INFO" additivity="true"> 
    <appender-ref ref="xyz"/> 
</logger> 

<logger name="com.aaa.bbb.ccc" level="INFO" additivity="true"> 
    <appender-ref ref="abc"/> 
</logger> 

<root> 
    <level value="INFO" /> 
    <appender-ref ref="STDOUT" /> 
</root> 

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