我在我的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)获取一些灵感。确切的配置取决于你正在使用的安全框架... –