2010-06-01 3 views
19

Tôi đang cố gắng loại bỏ đầu ra của dòng ghi nhật ký durinng khi sử dụng trình ghi nhật ký mặc định trong java.util.logging. Ví dụ: đây là một đầu ra điển hình:java.util.logging: cách chặn dòng ngày

 
Jun 1, 2010 10:18:12 AM gamma.utility.application info 

INFO: ping: db-time=2010-06-01 10:18:12.0, local-time=20100601t101812, duration=180000
Jun 1, 2010 10:21:12 AM gamma.utility.application info
INFO: ping: db-time=2010-06-01 10:21:12.0, local-time=20100601t102112, duration=180000

Tôi muốn loại bỏ các dòng Jun 1, 2010..., chúng chỉ làm lộn xộn đầu ra nhật ký của tôi. Tôi có thể làm cái này như thế nào?

+0

Định dạng đầu ra tùy thuộc vào Trình định dạng đang được sử dụng. http://java.sun.com/j2se/1.4.2/docs/api/java/util/logging/Formatter.html. Bạn có thể chỉ định những gì là của bạn và xuất bản cấu hình của nó? – Anton

+0

cung cấp tệp .properties của bạn? – Bozho

+0

Anton, tôi sử dụng java.util.logging.SimpleFormatter trong jdk 1.6. Tôi đã thử tạo một trình định dạng đơn giản và ghi đè phương thức định dạng (LogRecord) nhưng điều đó không giúp ích gì. – andrewz

Trả lời

12

Vấn đề là do một trình xử lý trong nhật ký cha. Giải pháp là để loại bỏ tất cả các trình xử lý từ nhật ký cha, và sau đó thêm trình xử lý tùy chỉnh của riêng. Mã này loại bỏ bộ xử lý từ nhật ký mẹ:

 
     for(Handler iHandler:log.getParent().getHandlers()) 
     { 
     log.getParent().removeHandler(iHandler); 
     } 
+6

thay vì 'log.setUseParentHandlers (false);' cũng có thể được sử dụng –

5

Viết trình định dạng tùy chỉnh mở rộng java.util.logging.Formatter lớp và triển khai phương thức String format(LogRecord) theo nhu cầu của bạn. Ví dụ, định dạng sau đây chỉ hiển thị các thông điệp log (và stacktrace Throwable nếu một ngoại lệ đã được đăng nhập):

import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.util.logging.Formatter; 
import java.util.logging.LogRecord; 

class CustomRecordFormatter extends Formatter { 
    @Override 
    public String format(final LogRecord r) { 
     StringBuilder sb = new StringBuilder(); 
     sb.append(formatMessage(r)).append(System.getProperty("line.separator")); 
     if (null != r.getThrown()) { 
      sb.append("Throwable occurred: "); //$NON-NLS-1$ 
      Throwable t = r.getThrown(); 
      PrintWriter pw = null; 
      try { 
       StringWriter sw = new StringWriter(); 
       pw = new PrintWriter(sw); 
       t.printStackTrace(pw); 
       sb.append(sw.toString()); 
      } finally { 
       if (pw != null) { 
        try { 
         pw.close(); 
        } catch (Exception e) { 
         // ignore 
        } 
       } 
      } 
     } 
     return sb.toString(); 
    } 
} 

Đây là cách bạn sử dụng nó:

import java.util.logging.ConsoleHandler; 
import java.util.logging.Logger; 

class A { 
    private static final Logger LOGGER = Logger.getLogger(A.class.getName()); 

    static { 
     CustomRecordFormatter formatter = new CustomRecordFormatter(); 
     ConsoleHandler consoleHandler = new ConsoleHandler(); 
     consoleHandler.setFormatter(formatter); 
     LOGGER.addHandler(consoleHandler); 
    } 

    public void doSomething() { 
     LOGGER.info("something happened"); 
    } 
} 
+0

Tôi sẽ thử tính năng này, nhưng khi tôi thử một điều gì đó tương tự lần trước nó đã không 't làm việc. – andrewz

+0

Cần phải làm theo câu trả lời của andrew dưới đây ngoài việc này :) –

+0

Trình định dạng là cuối cùng. –

31

Từ Java SE 7 có một tính chất hệ thống mới: java.util.logging.SimpleFormatter.format.

Cùng một thuộc tính cũng có thể định cấu hình trên tệp thuộc tính java.util.logging (logging.properties). Nếu bạn là người dùng Eclipse và bạn cảm thấy khó chịu bởi thông báo dòng kép trong đầu ra bàn điều khiển, bạn có thể thay đổi tệp jre logging.properties (JDK_HOME/jre/lib/logging.properties) theo cách sau:

java.util.logging.SimpleFormatter.format =% 4 $ s:% 5 $ s [% 1 $ tc]% n

Một số định dạng mẫu có sẵn tại đây: http://docs.oracle.com/javase/7/docs/api/index.html?java/util/logging/SimpleFormatter.html.

+1

có cách giải quyết nào cho Java 6 không? –

+1

Bạn vừa mới cứu ngày của chúng tôi, cảm ơn bạn đời. Đối với bản ghi, nếu bạn đang sử dụng Tomcat, bạn cũng có thể thay đổi điều này trong /etc/tomcat/logging.properties, bạn không cần thay đổi cài đặt Java chung. – bviktor

+0

Nếu bạn muốn thực hiện điều này theo chương trình, hãy xem câu trả lời tại đây: https://stackoverflow.com/questions/194765/how-do-i-get-java-logging-output-to-appear-on-a-single-line –