2011-01-18 45 views
11

Hi bình thường trong mức độ ưu tiên Log4j như sauThay đổi mức độ ưu tiên trong Log4j

  • DEBUG < INFO < WARN < LỖI < Fatal

Chúng ta có thể thay đổi mức độ ưu tiên này. Yêu cầu của tôi là tôi chỉ cần đăng nhập các chi tiết có mức độ ưu tiên INFO và FATAL. Nhật ký với mức độ ưu tiên DEBUG, WARN và ERROR không nên đăng nhập. Nếu tôi có thể thay đổi mức độ ưu tiên như

  • DEBUG < WARN < LỖI < INFO < Fatal

nó là có thể. Hay có cách nào khác để làm điều đó. Xin giúp đỡ ..

+0

Tại sao bạn không sử dụng WARN và Fatal hoặc CẢNH BÁO và L ERI? Đó thường là những gì hầu hết các dự án tôi đã nhìn thấy, và bạn không phải thay đổi cách log4j hoạt động và có khả năng gây nhầm lẫn cho những người mới tham gia dự án. – jmort253

+0

Không. Tôi đang ghi lại tất cả các cấp tin nhắn. Nhưng trong thực thi bình thường, tôi chỉ cần đăng nhập INFO và FATAL. Sẽ có dịp tôi cần gỡ lỗi ứng dụng. Vào thời điểm đó tôi sẽ đăng nhập tất cả các tin nhắn cấp 5. Tôi hy vọng sẽ làm điều đó bằng cách thay đổi tập tin cấu hình bên ngoài (không phải là một được sử dụng cho log4j) mà thay đổi mức độ ưu tiên của logger tôi đang sử dụng. – nath

+0

Bài tập về nhà ở mọi nơi? – gabuzo

Trả lời

26

Tôi chưa bao giờ cần phải làm điều này, nhưng vì tôi đã từng đọc Log4J - Hướng dẫn hoàn chỉnh, tôi hy vọng những gợi ý này sẽ hữu ích.

  1. Viết lọc tùy chỉnh của riêng bạn bằng cách mở rộng org.apache.log4j.spi.Filter
  2. Override decide method
  3. Sử dụng loggingEvent.getLevel(), để xác định mức độ log đã được kích hoạt.
  4. Viết logic sau đây trong quyết định

    if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL) 
        return ACCEPT; 
    return DENY; 
    

Bộ lọc này sẽ chấp nhận tất cả các bản ghi đó là một trong hai INFO hoặc gây tử vong. Bạn có thể sáng tạo hơn.

Xin lưu ý rằng tôi chưa thử nghiệm mã này. Đây chỉ là một hướng dẫn, hy vọng điều này sẽ giúp


Sửa: trên một tìm kiếm chút, tôi thấy một cái gì đó mà có thể được dễ dàng hơn. Tôi đoán, Bạn có thể sử dụng LevelMatchFilter, cách này

<filter class="org.apache.log4j.varia.LevelMatchFilter"> 
    <param name="LevelToMatch" value="info" /> 
    <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
    <param name="LevelToMatch" value="fatal" /> 
    <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.DenyAllFilter"/> 

tham khảo: http://wiki.apache.org/logging-log4j/Log4jXmlFormat cho configurarion XML. Có một phần trên Filter Configuration


Tôi không biết điều gì sẽ dừng OP khi chấp nhận câu trả lời này. Tôi vừa thử nghiệm, nó hoạt động:

Đây là XML.

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="util" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="D:/util.log" /> 
    <param name="Append" value="true" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/> 
    </layout>   

    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
     <param name="LevelToMatch" value="info" /> 
     <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.LevelMatchFilter"> 
     <param name="LevelToMatch" value="fatal" /> 
     <param name="AcceptOnMatch" value="true" /> 
    </filter> 
    <filter class="org.apache.log4j.varia.DenyAllFilter"/> 

    </appender> 

    <root> 
    <priority value ="debug" /> 
    <appender-ref ref="util" /> 
    </root> 


</log4j:configuration> 

Đây là mã Java

DOMConfigurator.configure("log4j.xml"); 
    Logger log = Logger.getLogger(Test.class); 
    log.debug("DEBUG"); 
    log.info("INFO"); 
    log.warn("WARN"); 
    log.error("ERROR"); 
    log.fatal("FATAL"); 

Đây là kết quả trong (như cấu hình) D:/util.log

main INFO test.Test - INFO 
main FATAL test.Test - FATAL 
+0

Cảm ơn dude .. Nó hoạt động tốt. Một lần nữa cảm ơn rất nhiều. :) – nath

+0

@ganuke vui vì nó đã giúp ích. – Nishant

0

Không, bạn không thể thay đổi ưu tiên ưu tiên trong Log4j. Nhưng bạn có thể viết thực hiện logger riêng của bạn, mà sẽ đăng nhập thông tin chỉ cần:

  • viết riêng LoggerFactory/Logger cặp bạn
  • định LoggerFactory trong log4j.properties file:

    log4j.loggerFactory = com.mycompany.mypackage .MyLog4JLoggerFactory

  • trong việc triển khai Trình ghi nhật ký của bạn, bỏ qua bất kỳ điều gì ngoại trừ lỗi INFO và FATAL.

Tuy nhiên, ở trên có thể không phải là giải pháp tốt nhất, vì nó hướng tới 1.2.x. Có lẽ các phiên bản mới hơn của log4j (SLF4J) có nhiều cách thanh lịch hơn để đạt được nó.

0

Bạn có thể thực hiện việc này bằng cách thực hiện một số thay đổi trong tệp log4j.properties.
Ví dụ: mức mặc định của bạn có thể là FATAL và sau đó bạn có thể chỉ định gói của bạn hoặc một lớp cho cấp INFO.

log4j.rootLogger = Fatal, stdout, R

Tuyên bố cho các bản ghi trọn gói:
log4j.logger.com.xxx = INFO

Tuyên bố cho các bản ghi Class:
log4j.logger.com. xxx.util.EmailManager = INFO

Hy vọng điều đó sẽ hữu ích.

+0

điều này sẽ không làm những gì anh ta muốn. bạn cần phải đọc câu hỏi đầy đủ – fmucar

+0

Tôi hiểu những gì anh ta hỏi và câu trả lời mà tôi đưa ra là giải pháp đơn giản nhất để ghi lại các câu lệnh log FATAL và INFO. – JSS

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