2009-08-11 73 views
13

我正在將中型應用程序的日誌記錄從定製解決方案遷移到更標準的過程。我決定使用Logback和SLF4J,並且我已經成功遷移了大部分Java代碼。不過,我有相當多的JSP只是使用System.out進行日誌記錄。我從來沒有用過很多JSP,並開始懷疑:我該如何在JSP中使用正確的日誌記錄?如何在JSP中使用SLF4J記錄器

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

這就是浮現在腦海的第一,但似乎錯了幾點:

  • 方式過於冗長,需要大量的工作,以現有的JSP
  • 一個呼叫轉換每次頁面呈現時都會向LoggerFactory.getLogger()發出(與標準Java類中的靜態logger字段相反)
  • 我認爲記錄器的名稱也將是非常簡單的東西

是否有某種標準或最佳實踐或任何用於登錄JSP的內容?

此外,IIRC,還有一些Log4J的taglib。有沒有類似SLF4J(或可能是Logback)?

回答

9

看一看slf4j-taglib

+2

據我所知,slf4j-taglib並沒有成爲maven的核心。對於任何人來說,這可能是一個掛斷。 – 2012-08-06 14:34:10

+0

它還沒有! – 2013-09-17 14:14:22

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); 
    } 
} 

那麼你的JSP頁面可能看起來像:

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

先走,我不認爲這是任何更好。這樣,每次我想記錄某些內容時,我都必須調用getLogger(),但是存在線程安全問題,這比原始解決方案更加冗長。 – 2009-08-11 08:05:30

+1

您可以使用面向方面編程技術來包裝標記庫執行的Java方法調用,並在每次執行之前和之後進行日誌記錄。無論如何,JSP不是業務邏輯的地方。它應該在JAVA控制器和模型部件中。 – 2009-08-11 08:29:34

5

你可以嘗試(請注意 「!」)

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

然後用

<% log.info("Hello Logging!"); %> 
取代你的System.out的

鮑里斯的評論應該真的採取儘管如此,JSPs通常不需要日誌記錄。我只會使用這種技術(或類似的任何東西)來替換需要保留的現有日誌記錄。

-1

我認爲從應用程序的表示層觸發日誌記錄是不好的做法。一般來說,我希望只在業務邏輯中找到日誌記錄 - 一個混雜着日誌記錄調用的JSP肯定會打破關注點分離原則。

作爲一種臨時而優雅的解決方法,您可以嘗試創建自定義標籤庫。

0

要在JSP文件中使用記錄儀,初始化記錄器對象以下列方式:

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

然後,你可以通過使用

logger.info(); or logger.error();, etc.