2016-02-24 14 views
7

Tôi đã thử các logger sauJava logging khuôn khổ mà không yêu cầu khai logger trên mỗi lớp

  • Java Logging API
  • Log4j
  • slf4j

Tất cả những đòi hỏi một bản tuyên bố Logger ở cấp lớp, giống như những người dưới đây

private final static java.util.logging.Logger.Logger LOGGER = java.util.logging.Logger.Logger.getLogger(MyClass.class.getName()); 
private final Logger slf4jLogger = LoggerFactory.getLogger(SLF4JHello.class); 
private final static Logger log4jLogger = Logger.getLogger(Log4jHello.class); 

Điều này có vẻ ghê tởm đối với tôi, có một khung công cụ logger trong java không yêu cầu khai báo này không?

Những gì tôi đang tìm kiếm là, tôi có thể có một tuyên bố toàn cầu như

private final static Logger Logger = Logger.getLogger(MyApp.class); 

Nhưng khi tôi gọi Logger.log (..) từ lớp XXX.class thì Logger nên sử dụng của tên XXX.class.

+2

Hoàn toàn tùy thuộc vào bạn (trong bất kỳ khung nào trong số này) cách bạn xác định và đặt tên cho người đăng nhập của mình. Bạn chỉ có thể có một cho toàn bộ ứng dụng của mình hoặc gọi 'getLogger' trên bất kỳ cuộc gọi nào. – Thilo

+0

Liên quan: http://stackoverflow.com/questions/26600757/standard-way-to-implement-a-logger-across-classes-in-java?rq=1 http://stackoverflow.com/questions/27038694/ là-có-một-dễ-cách-để-tạo-một-logger-dụ-cho-mỗi-lớp? rq = 1 – Thilo

+0

@ Thilo có một cho toàn bộ ứng dụng sẽ làm cho tất cả các bản ghi có cùng tên. Mà không phải là tôi đang tìm kiếm. Thay vào đó, khung công tác phải hiển thị tên lớp của người gọi. – Edi

Trả lời

2

Vấn đề của bạn là nhiều hơn khả năng không phải với khung đăng nhập nhưng với cách bố trí.

dụ bê tông

so35592962/App.java

package so35592962; 
import org.apache.logging.log4j.*; 
import so35592962.sub.OtherClass; 
public class App { 
    public static final Logger logger = LogManager.getLogger(); 
    public static void main(String[] args) { 
    logger.error("in App.main"); 
    OtherClass.act(); 
    } 
} 

so35592962/sub/OtherClass.java

package so35592962.sub; 
import static so35592962.App.logger; 

public class OtherClass { 
    public static void act() { 
    logger.error("OtherClass.act"); 
    } 
} 

Vì vậy, bạn có thể thấy điều này là hoàn toàn những gì bạn muốn: lớp có sử dụng một logger duy nhất. Vì vậy, điểm tốt, Log4J2 có thể được sử dụng cho điều đó.

Bây giờ tôi thêm các tập tin ma thuật log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n"/> 
    </Console> 
    </Appenders> 
    <Loggers> 
    <Root level="error"> 
     <AppenderRef ref="Console"/> 
    </Root> 
    </Loggers> 
</Configuration> 

Chạy này sẽ in:

12:05:28.834 [main] ERROR so35592962.App - in App.main 
12:05:28.836 [main] ERROR so35592962.sub.OtherClass - OtherClass.act 

Look, có tên lớp khác nhau ở đây! Tuy nhiên, tôi đã sử dụng Log4J2.

Điều gì đã xảy ra ở đây?

Lưu ý mô hình sử dụng trong thẻ PatternLayout:

%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n

Các ví dụ tiêu chuẩn và những gì bạn thường thấy trên Internet đều sử dụng mô hình %L. Mẫu này là để hiển thị tên của trình ghi nhật ký. Nhưng bạn nói bạn không muốn nó. May mắn thay, các mẫu khác tồn tại. %C sẽ hiển thị tên lớp thay vì tên nhật ký. Đây là mẫu được sử dụng ở đây.

Theo the PatternLayout documentation, mô hình %C nào sau đây:

Đầu ra tên lớp đầy đủ của người gọi việc tạo yêu cầu đăng nhập.

Lưu ý quan trọng, cũng được đề cập trong tài liệu hướng dẫn:

Tạo tên lớp của người gọi (thông tin vị trí) là một hoạt động tốn kém và có thể ảnh hưởng hiệu suất. Sử dụng cẩn thận.

+0

Nhưng nếu bạn chỉ có một Logger duy nhất, bạn không thể gán các mức log khác nhau (hoặc các trình định dạng khác nhau hoặc các trình ứng dụng khác nhau) vào các Logger khác nhau nữa. – Thilo

+0

Đúng, nhưng điều này trả lời câu hỏi ban đầu, tôi tin. Một logger duy nhất, sử dụng tên lớp. –

+2

Ngoài ra, câu trả lời này không phải là "có, bằng mọi cách, làm điều này", nhưng "yêu cầu của bạn có thể được thực hiện, đây là cách". Cá nhân tôi không xác nhận điều này, nhưng nếu ti làm việc cho OP, tôi rất vui vì tôi đã giúp! –

1

Bạn có thể thay đổi cả hai chú thích này thành chú thích lớp bằng Lombok.

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