首页 > 技术文章 > Logstash集成

Alay 2021-08-08 19:58 原文

加入依赖:

<dependency>
   <groupId>net.logstash.logback</groupId>
   <artifactId>logstash-logback-encoder</artifactId>
</dependency>

配置:

behelpful:
  platform:
    logstash:
      server-address: 192.168.0.171:5044
      loggers:
        com.behelpful: debug
        org.springframework: info

注入配置的属性:

Data
@ConfigurationProperties(prefix = "behelpful.platform.logstash")
public class LogstashProperties {
 
   /**
    * 日志中心的logstash地址。
    */
   private String serverAddress = "127.0.0.1:5044";
   private LogLevel logLevel = LogLevel.INFO;
   private Map<String, LogLevel> loggers = new HashMap<>();
}

配置:

@Slf4j
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties({
      LogstashProperties.class
})
@ConditionalOnProperty(name = "behelpful.platform.logstash.server-address")
public class LogstashConfiguration {
 
   @Value("${spring.application.name}")
   private String serviceName;
 
   @Autowired
   private LogstashProperties logstashProperties;
 
   @PostConstruct
   public void init() {
      Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
      LoggerContext loggerContext = rootLogger.getLoggerContext();
 
      LogstashTcpSocketAppender logstashTcpSocketAppender = new LogstashTcpSocketAppender();
      logstashTcpSocketAppender.setName("LOGSTASH");
      logstashTcpSocketAppender.setContext(loggerContext);
      logstashTcpSocketAppender.addDestination(logstashProperties.getServerAddress());
 
      LoggingEventFormattedTimestampJsonProvider timestampJsonProvider = new LoggingEventFormattedTimestampJsonProvider();
      timestampJsonProvider.setTimeZone("UTC");
      timestampJsonProvider.setContext(loggerContext);
      LoggingEventPatternJsonProvider patternJsonProvider = new LoggingEventPatternJsonProvider();
      patternJsonProvider.setPattern(getJsonPattern());
      patternJsonProvider.setContext(loggerContext);
 
      JsonProviders<ILoggingEvent> jsonProviders = new JsonProviders<>();
      jsonProviders.addProvider(patternJsonProvider);
      jsonProviders.addProvider(timestampJsonProvider);
 
      LoggingEventCompositeJsonEncoder encoder = new LoggingEventCompositeJsonEncoder();
      encoder.setContext(loggerContext);
      encoder.setProviders(jsonProviders);
      encoder.start();
 
      logstashTcpSocketAppender.setEncoder(encoder);
      logstashTcpSocketAppender.start();
 
      rootLogger.addAppender(logstashTcpSocketAppender);
      rootLogger.setLevel(Level.toLevel(logstashProperties.getLogLevel().name(), Level.INFO));
 
      Map<String, LogLevel> loggers = logstashProperties.getLoggers();
      loggers.forEach((key, value) -> {
         Logger logger = (Logger) LoggerFactory.getLogger(key);
         logger.setLevel(Level.toLevel(value.name()));
      });
 
      log.info("[Eurynome] |- Bean [Logstash Tcp Socket Appender] Auto Configure.");
   }
 
   private String getJsonPattern() {
      LogstashPattern pattern = new LogstashPattern();
      if (StrUtil.isNotBlank(serviceName)) {
         pattern.setService(serviceName);
      }
      return JSON.toJSONString(pattern);
   }
}

将日志解析为JSON的定义实体:

@Data
public class LogstashPattern implements Serializable {
    private String level = "%level";
    private String service;
    private String trace = "%X{X-B3-TraceId:-}";
    private String span = "%X{X-B3-SpanId:-}";
    private String parent = "%X{X-B3-ParentSpanId:-}";
    private String exportable = "%X{X-Span-Export:-}";
    private String pid = "${PID:-}";
    private String thread = "%thread";
    private String clazz = "%logger";
    private String log = "%message";
}

创建一个启动注解(开关的作用)

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(LogstashConfiguration.class)
public @interface EnableLogstash {
}

仅仅只是简单示例;

 

 

 

 

推荐阅读