2009-12-03 33 views
48

Tôi có nhật ký mức INFO bình thường cho ứng dụng. Những gì tôi cần là để ghi lại tất cả các sự kiện cấp ERROR để tách nhật ký lỗi. Tôi đang sử dụng cấu hình như sau:Cách cấu hình log4j để đăng nhập các mức nhật ký khác nhau cho các tệp khác nhau cho cùng một bộ ghi

<logger name="com.acme"> 
    <level value="error"/> 
    <appender-ref ref="error"/> 
</logger> 

<logger name="com.acme"> 
    <level value="info"/> 
</logger> 

<root> 
    <level value="warn"/> 
    <appender-ref ref="general"/> 
</root> 

Cấu hình này chỉ ghi nhật ký lỗi. Nếu tôi đặt logger thông tin đầu tiên, sau đó nó sẽ đăng nhập chỉ để appender chung, nhưng logger lỗi sẽ không hoạt động. Tôi muốn cả hai đều làm việc.

Trả lời

60

Những gì bạn cần làm là có một định nghĩa <logger> duy nhất với một mức INFO được xác định, nhưng trong hai định nghĩa của người gắn kết, bạn đặt ngưỡng của chúng cho phù hợp, ví dụ:

<appender name="ERROR_FILE"> 
    <param name="Threshold" value="ERROR"/> 
</appender> 

<appender name="GENERAL"> 
    <param name="Threshold" value="INFO"/> 
</appender> 

Sau đó bạn có thêm cả appenders để logger của bạn:

<logger name="com.acme"> 
    <level value="INFO"/> 
    <appender-ref ref="ERROR_FILE"/> 
    <appender-ref ref="GENERAL"/> 
</logger> 

mục Log nay đi đến logger sẽ được gửi đến cả appenders, nhưng kể từ khi họ có ngưỡng độc lập khác nhau, appender ERROR_FILE sẽ chỉ log ERROR trở lên.

+0

@vilmonts Nếu bạn xác định các logger cùng (com.acme) hai lần, một trong số họ bị ghi đè, và đó là lý do tại sao bạn không thể nhìn thấy Thông báo INFO: thông báo đầu tiên (có "lỗi") sẽ xóa thông báo tiếp theo (với thông báo "thông tin"). –

+1

Cảm ơn, skaffman. Bạn đã cứu cuộc đời tôi. – vilmonts

+1

Nhưng tôi muốn cho phép ứng dụng ERROR_FILE của tôi nhận được các thông báo gỡ lỗi được chọn của một số trình ghi nhật ký khác ?! – AmanicA

4

Bạn cần phải sử dụng các bộ lọc log4j:

<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
    <param name="levelMin" value="ERROR" /> 
    <param name="levelMax" value="ERROR" /> 
</filter> 

Bằng cách đó bạn có thể tạo các file bản ghi cho mỗi cấp độ riêng biệt.

+0

đây là một câu trả lời tuyệt vời. tôi đang sử dụng các tệp .properties cho cấu hình log4j của mình. Bạn có thể vui lòng bao gồm trong câu trả lời của bạn như thế nào tôi sẽ đi về cấu hình bộ lọc này trong .properties? xin vui lòng –

5

giải pháp làm việc đầy đủ bao gồm cả ngày trong filename:

<appender name="InfoFileAppender" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="FileNamePattern" value="/var/output/Info_%d{ddMMyyyy}.log" /> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" /> 
    </layout> 
    <filter class="org.apache.log4j.varia.LevelRangeFilter"> 
     <param name="levelMin" value="INFO" /> 
     <param name="levelMax" value="INFO" /> 
    </filter> 
</appender> 

<appender name="ErrorFileAppender" class="org.apache.log4j.rolling.RollingFileAppender"> 
    <param name="Threshold" value="ERROR" /> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="FileNamePattern" value="/var/output/Error_%d{ddMMyyyy}.log" /> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" /> 
    </layout> 
</appender> 
<root> 
    <level value="INFO" /> 
    <appender-ref ref="InfoFileAppender" /> 
    <appender-ref ref="ErrorFileAppender" /> 
</root> 
Các vấn đề liên quan