我在我的spring應用程序中使用sl4j Logger。環繞日誌條目
我想追加一個自定義字符串到整個應用程序中完成的所有日誌條目(信息/跟蹤/調試等)。理想情況下,這可以使用Aspect來完成,但我不確定該方面會採用何種格式。我假設沿線
@Around("org.slf4j.Logger.info(*)")
但是我找不到任何可靠的方法,使其適用於正確涉及的所有方法。
我在我的spring應用程序中使用sl4j Logger。環繞日誌條目
我想追加一個自定義字符串到整個應用程序中完成的所有日誌條目(信息/跟蹤/調試等)。理想情況下,這可以使用Aspect來完成,但我不確定該方面會採用何種格式。我假設沿線
@Around("org.slf4j.Logger.info(*)")
但是我找不到任何可靠的方法,使其適用於正確涉及的所有方法。
由於@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>
然而,這似乎並不適用於我所有的信息。一些警告似乎沒有顯示該領域。目前正在調查。
關於你的評論 - MDC是通過ThreadLocal變量實現的。您是否可以驗證丟失的MDC是否不存在ASYNC請求(或者與其他方式的請求無關 - 例如計劃任務)?另外請注意,'filter-mapping'只適用於REQUEST調度(如果未明確指定),並且例如在發送ERROR時不應用。我希望你認識到之前記錄的任何內容(從調用堆棧的角度來看「上面」)過濾器都不會有MDC。 –
事實上,問題在於某些日誌不是根據請求從系統調用的。因此他們不被過濾器捕獲。包含未捕獲異常的方面存在,但不包括由系統執行的正常日誌條目。這些如何解決? – mangusbrother
「not upon request」=>取決於你的MDC是什麼,以及我們正在談論的是什麼日誌。如果這些例如是在應用程序啓動時記錄的日誌條目,那麼使用MDC可能幾乎沒有任何好處。如果它是經過身份驗證的計劃任務,則應在設置身份驗證後立即設置MDC等。 –
這是[映射](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),而不是方面換行。 –
我需要在創建日誌時解析字符串,而不是預先根據調用日誌的人員需要更改字符串。這仍然可以完成嗎? – mangusbrother
MDC通常在初始化安全上下文後,在servlet過濾器中初始化。只需google [MDC servlet過濾器](https://www.google.cz/search?q=mdc+servlet+filter)獲取一些靈感。確切的配置取決於你正在使用的安全框架... –