2010-08-16 41 views
6

Tôi muốn trang bị thêm slf4j bằng tính năng Đăng nhập vào ứng dụng cũ. Điều tốt là, ứng dụng kế thừa có khung khai thác gỗ riêng. Vì vậy, tất cả những gì tôi phải làm là thay đổi khung đăng nhập để đăng nhập vào slf4j thay vì log4j.Bao gồm API slf4j

Nó hoạt động như một giấc mơ. Tôi đã vui, cho đến khi tôi nhận thấy vị trí Đăng nhập đã đăng nhập cho mỗi sự kiện nhật ký:

Logger.java:... 

Yikes! Điều đó sẽ không giúp các nhà phát triển đồng nghiệp của tôi nhiều khi cố gắng tìm ra sự kiện đăng nhập từ đâu.

Làm cách nào tôi có thể cho phép Logback xem xét một vài cấp độ trong ngăn xếp cho vị trí thực tế để đăng nhập?

Lớp logger là một lớp tiện ích với các phương pháp như thế này:

public static void debug(String clazz, String message) { 
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz); 
    logger.debug(message); 
} 
+1

câu hỏi tương tự: http: // stackoverflow.com/questions/1486233/java-logging-show-the-source-line-number-of-the-caller-not-the-logging-helper-m – Thilo

+0

đã làm công việc này khi nó đã được sử dụng log4j? Tôi nghĩ rằng kể từ khi bạn cập nhật một lớp đăng nhập hiện có, bạn đã không thêm một khung phụ vào ngăn xếp cuộc gọi, do đó, phiên bản log4j nên đã trưng bày cùng một vấn đề. – Thilo

+1

log4j cho thấy một phương thức đăng nhập trong API công cộng của nó trông giống như một khung phụ lên ngăn xếp trong khi slf4j thì không. Vì vậy, có, nó đã làm việc với log4j. –

Trả lời

10

Tìm thấy giải pháp nhìn vào nguồn của jcl-over-slf4j. Hầu hết các triển khai của slf4j (bao gồm logback) sử dụng logger mà thực hiện LocationAwareLogger, trong đó có một phương pháp ghi rằng hy vọng tên lớp đầy đủ của lớp gói logger là một trong những lý lẽ của nó:

private static final String FQCN = Logger.class.getName(); 


public static void debug(String clazz, String message) { 
    org.slf4j.Logger logger = LoggerFactory.getLogger(clazz); 
    if (logger instanceof LocationAwareLogger) { 
     ((LocationAwareLogger) logger).log(null, FQCN, LocationAwareLogger.DEBUG_INT, message, null, null); 
    } else { 
     logger.debug(message); 
    } 
} 
5

Xem việc triển khai XXX-over-slf4j khác nhau để làm thế nào để làm điều đó.

Về cơ bản bạn muốn thay thế hoàn toàn khung đăng nhập hiện tại của mình. Không quấn slf4j.

Edit:

cách tiếp cận khác có thể được viết cách bố trí của riêng bạn subclassing mà bạn sử dụng hiện nay, trong đó có một ý nghĩa sửa đổi của% m,% l lĩnh vực vv mà bỏ qua các khung stack thêm.

+2

Tôi đã xem xét giải pháp đó, nhưng hiện tại không có ngân sách để thay thế 10000+ báo cáo nhật ký nằm rải rác trên hơn 50 dự án. –

+0

Bạn không cần phải thay đổi các câu lệnh tường trình, nhưng mã nó gọi (mà hy vọng là trong thư viện) –

+1

Khung trình ghi nhật ký có 10000 cuộc gọi phương thức từ tất cả các dự án tới nó. Vì vậy, nếu tôi thay thế khuôn khổ logger, tôi sẽ không phải thay thế tất cả các cuộc gọi phương thức cho nó? –