加入依赖:
<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 { }
仅仅只是简单示例;