2011-12-13 37 views
52

Tôi muốn thêm đăng nhập vào một ứng dụng tôi đang phát triển, bằng cách sử dụng apache log4j. Tại thời điểm này, tôi muốn chuyển hướng tất cả các thông điệp tường trình cho INFO cấp và thấp hơn (TRACE, DEBUG) đến stdout và tất cả các thông điệp tường trình khác từ WARN trở lên (ERROR, FATAL) đến stderr. Ví dụ:Lỗi ghi nhật ký để gỡ lỗi và gỡ lỗi, thông tin để stdout với log4j

... 
logger.info("Processing at some point"); // must be written to stdout 
logger.debug("Point x was processed"); // must be written to stdout 
logger.warn("Incorrect point config"); // must be written only to stderr 
logger.error("Exception occurred at point x"); // must be written only to stderr 

Vậy tệp log4j.properties của tôi là gì? Dưới đây là cách nhìn vào mẫu này:

log4j.rootLogger=DEBUG, stdout, stderr 

# configure stdout 
# set the conversion pattern of stdout 
# Print the date in ISO 8601 format 
log4j.appender.stdout = org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Threshold = DEBUG 
log4j.appender.stdout.Target = System.out 
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 

# configure stderr 
# set the conversion pattern of stdout 
# Print the date in ISO 8601 format 
log4j.appender.stderr = org.apache.log4j.ConsoleAppender 
log4j.appender.stderr.Threshold = WARN 
log4j.appender.stderr.Target = System.err 
log4j.appender.stderr.layout = org.apache.log4j.PatternLayout 
log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 

Vấn đề với cấu hình ở trên là logger.error() ... cũng được in ở chế độ xuất chuẩn.

Trả lời

9

bài trước mỗi Jon Skeet tại Post

unfortunately there is no maximum threshold, so wherever you get debug messages, you also get warning messages. That's a bit of a pain, IMO.

+0

Cảm ơn bạn đã trả lời nhanh chóng của bạn. Có cách nào để phân lớp các appender (ví dụ như stdout appender) vì vậy khi một bản ghi trên INFO sẽ bị từ chối? Điều gì về các bộ lọc: thiết lập một bộ lọc cho stdout để chỉ chấp nhận các bản ghi TRACE, DEBUG, INFO? – Elvis

+0

Tuyệt đối. Bạn có thể tạo appender của riêng bạn và trỏ đến nó trong tập tin cấu hình. –

+1

Đây là một ví dụ về (trong cấu hình xml) http://stackoverflow.com/questions/4825072/how-to-set-filter-in-the-log4j-xml như vậy là giống như: log4j.appender.stdout. Filter = org.apache.varia.LevelRangeFilter log4j.appender.stdout.Filter.LevelMax = INFO log4j.appender.stdout.Filter.LevelMin = TRACE? Nếu có vẻ như nó không hoạt động trong trường hợp của tôi. Một thông báo cảnh báo được gửi bởi log4j cho biết bộ lọc không thể được thiết lập ... – Elvis

45

Giải Quyết dưới đây cũng trong thuộc tính tập tin định dạng. Bí quyết là lấy đúng định nghĩa bộ lọc. Log4j properties info here

Nỗ lực ban đầu, sửa đổi để lọc WARN & LỖI:

log4j.rootLogger=TRACE, stdout, stderr 

# configure stdout 
# set the conversion pattern of stdout 
# Print the date in ISO 8601 format 
log4j.appender.stdout = org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Threshold = TRACE 
log4j.appender.stdout.Target = System.out 
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 
log4j.appender.stdout.filter.filter1=org.apache.log4j.varia.LevelRangeFilter 
log4j.appender.stdout.filter.filter1.levelMin=TRACE 
log4j.appender.stdout.filter.filter1.levelMax=INFO 

# configure stderr 
# set the conversion pattern of stdout 
# Print the date in ISO 8601 format 
log4j.appender.stderr = org.apache.log4j.ConsoleAppender 
log4j.appender.stderr.Threshold = WARN 
log4j.appender.stderr.Target = System.err 
log4j.appender.stderr.layout = org.apache.log4j.PatternLayout 
log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 
+0

Bạn có chắc chắn bộ lọc có thể được áp dụng cho ứng dụng thứ nhất như thế không? Tôi không có may mắn bằng cách sử dụng a.các thuộc tính file –

+0

Giải pháp này làm việc cho tôi, có lẽ điều này nên được đánh dấu là giải pháp thay vì câu trả lời được cung cấp bởi John B – Stefan

5
  1. thay vì sử dụng cấu hình .properties bạn phải sử dụng một cấu hình .xml.
  2. Trong cấu hình .xml đặt thành phần có tên "bộ lọc" thuộc loại "org.apache.log4j.varia.LevelRangeFilter" và đặt tham số LevelMaxLevelMin.

Ví dụ: cấu hình .xml sau xác định hai trình cài đặt: stdout, stderr. Các stdout in tất cả các bản ghi có một mức độ nhỏ hơn hoặc bằng INFO để stdout, và stderr in tất cả các bản ghi với mức lớn hơn INFO để stderr.

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
    Document : log4j.xml 
    Created on : 13 Δεκέμβριος 2011, 3:55 μμ 
    Author  : elitex 
    Description : Purpose of the document follows. 
--> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > 
<log4j:configuration> 
    <appender name="stderr" class="org.apache.log4j.ConsoleAppender"> 
     <param name="threshold" value="warn" /> 
     <param name="target" value="System.err"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" /> 
     </layout> 
    </appender> 
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> 
     <param name="threshold" value="debug" /> 
     <param name="target" value="System.out"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" /> 
     </layout> 
     <filter class="org.apache.log4j.varia.LevelRangeFilter"> 
      <param name="LevelMin" value="debug" /> 
      <param name="LevelMax" value="info" /> 
     </filter> 
    </appender> 
    <root> 
     <priority value="debug"></priority> 
     <appender-ref ref="stderr" /> 
     <appender-ref ref="stdout" /> 
    </root> 
</log4j:configuration> 

Để biết thêm thông xem xét: http://www.laliluna.de/articles/posts/log4j-tutorial.html

1

ví dụ khác sử dụng ThresholdFilter đánh dấu từ log4j2.

<Console name="ConsoleERR" target="SYSTEM_ERR"> 
    <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/> 
    <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> 
</Console> 

Xem doc.

0

Đây là cấu hình logback mà thực hiện chính xác những gì bạn yêu cầu (!):

<?xml version="1.0" encoding="UTF-8"?> 
<configuration debug="true" scan="true" scanPeriod="30 seconds"> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <target>System.out</target> 
     <filter class="ch.qos.logback.classic.filter.LevelFilter"> 
      <level>INFO</level> 
      <onMatch>ACCEPT</onMatch> 
      <onMismatch>DENY</onMismatch> 
     </filter> 
     <encoder> 
      <pattern> 
       %-4relative [%thread] %-5level %logger - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender"> 
     <target>System.err</target> 
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
      <level>WARN</level> 
     </filter> 
     <encoder> 
      <pattern> 
       %-4relative [%thread] %-5level %logger - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <root level="${LOGBACK_ROOT_LEVEL:-INFO}"> 
     <appender-ref ref="STDOUT" /> 
     <appender-ref ref="STDERR" /> 
    </root> 

</configuration> 
+0

Không, tôi xin lỗi, cũng lọc ra các dấu vết và thông báo gỡ lỗi – Thirdman

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