2015-12-08 26 views
6

Tôi đã có một thiết lập đơn giản để ghi lại một thông điệp: JDK 8 Update 65Eclipse MarsTại sao java.util.logging.Logger in ra stderr?

import java.util.logging.Logger; 

public class Example { 

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

    public static void main(String[] args) { 
     LOGGER.info("Test"); 
    } 

} 

tôi mong chờ để có được một sản lượng trên stdout, cũng giống như sử dụng System.out.println();.
Nhưng thay vì nó được in ra trên stderr, mà kết quả trong một phông chữ màu đỏ trên eclipse console:

enter image description here

tôi biết rằng tôi có thể thay đổi hành vi này bằng cách viết một tùy chỉnh Handler, nhưng tôi muốn biết lý do tại sao đầu ra mặc định xuất hiện trên stderr thay vì stdout?

Trình ghi nhật ký nên sử dụng stdout cho fine + info và sử dụng stderr cho mức severe.

Trả lời

0

Theo mặc định, trình ghi nhật ký xuất nhật ký nhật ký của mức INFO trở lên (tức là, INFO, WARNING và SEVERE) vào luồng lỗi chuẩn (System.err).

Nguồn: www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html

+0

Bạn có nguồn hoặc bằng chứng cho tuyên bố này không? –

+0

Xin lỗi, tôi cần phải cung cấp nó trong bình luận :) https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html –

+0

Rằng logger nào đã được biết đến bởi OP, câu hỏi là: "tại sao". – Tom

3

Nó cũng được ghi nhận. Theo mặc định, logger xuất bản để xử lý của cha mẹ của họ, đệ quy lên đến cây, cho đến khi xử lý khác đã được chỉ định. Bạn có thể lặp qua các trình xử lý của cha và thấy rằng trình xử lý mặc định của trình ghi log của cha mẹ là ConsoleHandler, sử dụng System.err để xuất bản các bản ghi nhật ký.

public class Main { 
    public static void main(String[] args) { 
     Handler[] handlers = Logger.getLogger(Main.class.getName()).getParent().getHandlers(); 
     for (Handler handler : handlers) { 
      System.out.println(handler.getClass().getName()); 
     } 
    } 
} 
2

java.util.logging API được phát triển theo JSR 47: Logging API Specification. Theo nhật ký thay đổi trong "Bản thảo cuối cùng được đề xuất", ConsoleHandler luôn sử dụng System.err. Trang JCP cũng liệt kê các tác giả gốc của API và tôi chỉ nghĩ rằng những tên đó thực sự biết câu trả lời cho câu hỏi của bạn.

Tôi sẽ tưởng tượng nguồn gốc xuất phát từ tư duy rằng nhật ký dành cho báo cáo lỗi và báo cáo lỗi được chuyển hướng đến System.err. Thực sự cho ConsoleHandler, bất kỳ cấp độ nào trên INFO nên đi đến luồng lỗi và mọi cấp độ INFO hoặc ít hơn sẽ đi ra ngoài luồng nếu bạn đang cố gắng duy trì tiền lệ của JDK trước khi bổ sung API ghi nhật ký.

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