2009-08-11 30 views
13

Tôi đang trong quá trình di chuyển việc ghi nhật ký của một ứng dụng cỡ trung bình từ một giải pháp tùy chỉnh sang một tiêu chuẩn nào đó hơn. Tôi đã quyết định sử dụng Logback và SLF4J, và tôi đã di chuyển thành công hầu hết mã Java. Tuy nhiên, tôi có khá nhiều JSP chỉ đơn giản sử dụng System.out để ghi nhật ký. Tôi đã không bao giờ làm việc nhiều với JSP, và bắt đầu tự hỏi: làm thế nào tôi phải sử dụng đăng nhập thích hợp trong một JSP?Làm thế nào để sử dụng Logger SLF4J trong một JSP

<%@page import="org.slf4j.Logger"%> 
<%@page import="org.slf4j.LoggerFactory"%> 
<% 
    Logger log = LoggerFactory.getLogger(getClass()); 
%> 
<!-- ... --> 
<% 
    log.info("Hello Logging!"); 
%> 

Đây là những gì xuất hiện trong đầu đầu tiên, nhưng có vẻ như sai về một số điểm:

  • cách quá dài dòng, và cần rất nhiều công việc để chuyển đổi JSP hiện
  • một cuộc gọi là được thực hiện cho LoggerFactory.getLogger() mỗi lần trang được hiển thị (trái ngược với trường tĩnh logger trong lớp Java chuẩn)
  • Tôi nghĩ tên của trình ghi nhật ký cũng sẽ không thực sự đơn giản theo cách này

Có một số loại tiêu chuẩn hoặc thực hành tốt nhất hay bất kỳ thứ gì để đăng nhập vào JSP không?

Ngoài ra, IIRC, có một số loại taglib cho Log4J. Có cái gì đó tương tự cho SLF4J (hoặc có thể Logback)?

Trả lời

9

Hãy xem slf4j-taglib.

+2

Theo như tôi thấy, slf4j-taglib đã không biến nó thành trung tâm maven. Chỉ cần một fyi cho bất cứ ai mà đó có thể là một hangup. –

+0

Nó chưa có! –

0
public enum MyLoggerFactory { 

    INSTANCE; 

    @SuppressWarnings("unchecked") 
    private final Map<Class, Logger> loggers = new HashMap<Class, Logger>(); 

    @SuppressWarnings("unchecked") 
    public Logger getLogger(Class clazz) { 
     if (loggers.get(clazz) == null) { 
      loggers.put(clazz, LoggerFactory.getLogger(clazz)); 
     } 
     return loggers.get(clazz); 
    } 
} 

Sau đó, trang JSP của bạn có thể trông giống như:

<% 
    MyLoggerFactory.INSTANCE.getLogger(getClass()).info("Hello Logging!"); 
%> 
+0

Tôi không nghĩ rằng đây là bất kỳ tốt hơn. Bằng cách này tôi sẽ phải gọi getLogger() mỗi khi tôi muốn đăng nhập một cái gì đó, có vấn đề an toàn chủ đề, và điều này thậm chí còn tiết lộ nhiều hơn sau đó là giải pháp ban đầu. –

+1

Bạn có thể sử dụng các kỹ thuật Lập trình hướng Aspect để bao bọc các cuộc gọi phương thức Java mà thư viện thẻ của bạn thực hiện và đăng nhập trước và sau mỗi lần thực thi. Dù sao, JSP không phải là một nơi cho logic kinh doanh.Nó phải nằm trong bộ điều khiển JAVA và các phần mô hình. –

5

Bạn có thể thử (Lưu ý "!")

<%! org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("JSPname"); %> 

Sau đó thay thế System.out của bạn với

<% log.info("Hello Logging!"); %> 

Nhận xét của Boris thực sự cần được thực hiện để concideration mặc dù, JSPs không cần phải đăng nhập nói chung. Tôi sẽ chỉ sử dụng kỹ thuật này (hoặc bất kỳ thứ gì tương tự) để thay thế việc ghi nhật ký hiện có cần được giữ lại.

-1

Tôi nghĩ rằng thực tiễn không tốt là kích hoạt ghi nhật ký từ việc sử dụng lớp biểu diễn của ứng dụng. Nói chung, tôi hy vọng sẽ tìm thấy đăng nhập trong logic kinh doanh chỉ - một JSP lộn xộn với yêu cầu khai thác gỗ chắc chắn sẽ phá vỡ sự tách biệt của nguyên tắc mối quan tâm.

Là giải pháp tạm thời nhưng thanh lịch, bạn có thể thử và tạo thẻ tùy chỉnh lib.

0

Để sử dụng logger trong file jsp, khởi tạo đối tượng logger theo cách sau:

<% Logger logger = LoggerFactory.getLogger(this.getClass()); %> 

Và sau đó bạn có thể đi trước bằng cách sử dụng

logger.info(); or logger.error();, etc. 
Các vấn đề liên quan