【问题标题】:adding string prefix to every log message in spring mvc log4j在spring mvc log4j中为每条日志消息添加字符串前缀
【发布时间】:2017-12-06 08:53:26
【问题描述】:

我想将我的字符串作为前缀添加到应用程序中的每条日志消息。我的意思是,我有几个 Java 应用程序,我希望其中一个在消息中有一些前缀,例如:

DATE, INFO(or other), [sample] (-->this is my added string) , rest of standard message

我看过几个教程,但没有一个适合我。我已经在 pom 中包含了依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

您对此有什么技巧或简单的解决方案吗?编写某种包装器或配置类?

【问题讨论】:

标签: java spring maven logging log4j


【解决方案1】:

映射诊断上下文 (MDC) 日志记录允许您设置与当前线程关联的属性,以便 SLF4J(通过您的记录器实现库)可以使用每个日志记录语句记录这些属性,而无需指定。 因此,您需要将前缀文本放入 MDC。如果您使用的是 Spring MVC,那么一种方法是实现 HandlerInterceptor。

import org.slf4j.MDC;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoggingInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        MDC.put("PREFIX", "your text");
        return true;
    }

    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        MDC.clear();
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        MDC.clear();
    }
}

import com.tigerit.kai.education.util.LoggingInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class BeanConfiguration {

   @Bean
   public LoggingInterceptor loggingHandlerInterceptor() {
      return new LoggingInterceptor();
   }

   @Bean
   public WebMvcConfigurerAdapter webConfigurer() {
      return new WebMvcConfigurerAdapter() {
         @Override
         public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(loggingHandlerInterceptor());
         }
      };
   }
}

最后在 application.properties 中添加以下内容

logging.pattern.console=%d %-4r [%thread] %-5level PREFIX=%X{PREFIX} - %msg%n

【讨论】:

  • 我不知道为什么,但它显示"PREFIX="(我改变了preHandle方法)
  • 我认为 application.properties 中的行有问题。我正在尝试修改它
  • 如果我在 app.properties 中只写了这一行,那么它看起来相当不错。不知道是不是应该这样? logging.pattern.console=%d %-4r [%thread] %-5level HMAC - %msg%n
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多