2015-11-03 94 views
0

我在我的spring應用程序中使用sl4j Logger。環繞日誌條目

我想追加一個自定義字符串到整個應用程序中完成的所有日誌條目(信息/跟蹤/調試等)。理想情況下,這可以使用Aspect來完成,但我不確定該方面會採用何種格式。我假設沿線

@Around("org.slf4j.Logger.info(*)") 

但是我找不到任何可靠的方法,使其適用於正確涉及的所有方法。

+1

這是[映射](http://www.slf4j.org/manual.html#mdc)[診斷]的工作(https://logging.apache.org/log4j/2.x/manual/thread -context.html)[context](http://logback.qos.ch/manual/mdc.html),而不是方面換行。 –

+0

我需要在創建日誌時解析字符串,而不是預先根據調用日誌的人員需要更改字符串。這仍然可以完成嗎? – mangusbrother

+1

MDC通常在初始化安全上下文後,在servlet過濾器中初始化。只需google [MDC servlet過濾器](https://www.google.cz/search?q=mdc+servlet+filter)獲取一些靈感。確切的配置取決於你正在使用的安全框架... –

回答

0

由於@PavelHoral提及以下是使用MDC

解決方案創建自己的過濾器

import org.slf4j.MDC; 

import javax.servlet.*; 
import java.io.IOException; 

public class MDCLoggingFilter implements Filter { 

    @Override 
    public void init(final FilterConfig filterConfig) throws ServletException {} 

    @Override 
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { 

     MDC.put("myKey", "myValue"); 

     try { 
      chain.doFilter(request, response); 
     } finally { 
      // remove the key once you are done with it 
      MDC.remove("myKey"); 
     } 
    } 

    @Override 
    public void destroy() {} 

} 

那麼你的過濾器添加到你的web.xml如下

<filter> 
    <filter-name>mdcLoggingFilter</filter-name> 
    <filter-class>path.to.MDCLoggingFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>mdcLoggingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

然而,這似乎並不適用於我所有的信息。一些警告似乎沒有顯示該領域。目前正在調查。

+0

關於你的評論 - MDC是通過ThreadLocal變量實現的。您是否可以驗證丟失的MDC是否不存在ASYNC請求(或者與其他方式的請求無關 - 例如計劃任務)?另外請注意,'filter-mapping'只適用於REQUEST調度(如果未明確指定),並且例如在發送ERROR時不應用。我希望你認識到之前記錄的任何內容(從調用堆棧的角度來看「上面」)過濾器都不會有MDC。 –

+0

事實上,問題在於某些日誌不是根據請求從系統調用的。因此他們不被過濾器捕獲。包含未捕獲異常的方面存在,但不包括由系統執行的正常日誌條目。這些如何解決? – mangusbrother

+0

「not upon request」=>取決於你的MDC是什麼,以及我們正在談論的是什麼日誌。如果這些例如是在應用程序啓動時記錄的日誌條目,那麼使用MDC可能幾乎沒有任何好處。如果它是經過身份驗證的計劃任務,則應在設置身份驗證後立即設置MDC等。 –