如何使用SL4J将变量包装在Log4j2上

时间:2016-07-05 20:37:03

标签: java logging slf4j log4j2

目前,我的应用程序需要一些应该附加到日志消息的值。 由于它在SL4J下使用Log4J2,我首先想到的是为Log4J记录器做一个包装器,我可以将新值添加到输出中。

有些博客指出我应该写一个Logger,一个LoggerFactory和一个Binder。但它们已经过时了(2011年),并且没有希望让这些代码与当前的lib一起工作。

我还看到了一些关于ThreadContext的内容,看起来就像我想要构建这个测试一样。

所以我的问题是扩展日志记录机制的最实用(简单)方法是什么,并且我可以在日志消息的开头通过这个包装器从ThreadContext中放入/或恢复一些变量。

logger.info("this is a message"); // Custom logger looks the same as usual

但在内部它使用一些ThreadContext来增加日志消息。

@Override
public void info(final String format) {
    // get some value from ThreadContext
    // add some value that not exist on ThreadContext
    // use it on format string
    // format = container_name + " - " + GUUID + " - " + format;
    logger.logIfEnabled(FQCN, Level.INFO, null, format);
}

CODE

package hello;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

@Controller
@EnableAutoConfiguration
public class SampleController {

    final static Logger logger = LoggerFactory.getLogger(SampleController.class);

    @RequestMapping("/")
    @ResponseBody
    String home() {
        logger.info("this is a message");
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleController.class, args);
    }

}

输出

17:22:13.718 [http-nio-8080-exec-1] INFO  hello.SampleController - this is a message

渴望输出

17:22:13.718 [http-nio-8080-exec-1] INFO  hello.SampleController - CONTAINERXPTO - 0284-8576-9376-8376 - this is a message

引用

http://poth-chola.blogspot.com.br/2015/08/custom-slf4j-logger-adapter.html http://binkley.blogspot.com.br/2010/12/correct-slf4j-logger-wrapping.html http://javaeenotes.blogspot.com.br/2011/12/custom-slf4j-logger-adapter.html

1 个答案:

答案 0 :(得分:1)

以下博文

http://veerasundar.com/blog/2009/11/log4j-mdc-mapped-diagnostic-context-example-code/

描述了一种解决方案,用于透明地向记录调用添加额外的请求相关信息。

修改

简而言之,您需要在您的网络应用中添加一个servlet过滤器,用于根据每个请求获取您需要的信息。

在此过滤器中,您可以将信息放在名为MDC(映射诊断上下文)/ ThreadContext的线程局域映射中。 实现可能如下所示:

public class RequestInformationFilter implements Filter {

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

        try {
            MDC.put("variableName", "variableValue");

            chain.doFilter(request, response);

        } finally {
            MDC.remove("variableName");
        }

    }

}

之后,您可以在日志模式中使用%X {variableName}来打印variableName的值。