第三十二章 elk(3)- broker架構 + 引入logback


實際中最好用的日志框架是logback,我們現在會直接使用logback通過tcp協議向logstash-shipper輸入日志數據。在上一節的基礎上修改!!!

一、代碼

1、pom.xml

1         <!-- logstash-logback -->
2         <dependency>
3             <groupId>net.logstash.logback</groupId>
4             <artifactId>logstash-logback-encoder</artifactId>
5             <version>4.6</version>
6         </dependency>

2、application.properties

1 #set logstash shipper host
2 logstash.host=127.0.0.1
3 #set logstash shipper port
4 logstash.port=4560
5 logstash.level=info

3、LogstashProperties.java

 1 package com.xxx.secondboot.logstash;
 2 
 3 import org.springframework.boot.context.properties.ConfigurationProperties;
 4 import org.springframework.stereotype.Component;
 5 
 6 import lombok.Getter;
 7 import lombok.Setter;
 8 
 9 @Component
10 @ConfigurationProperties(prefix = "logstash")
11 @Getter
12 @Setter
13 public class LogstashProperties {
14     private String host;
15     private int    port;
16     private String level;
17 }

4、LogstashConfig.java

 1 package com.xxx.secondboot.logstash;
 2 
 3 import java.net.InetSocketAddress;
 4 
 5 import javax.annotation.PostConstruct;
 6 
 7 import org.slf4j.LoggerFactory;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.stereotype.Component;
10 
11 import ch.qos.logback.classic.Level;
12 import ch.qos.logback.classic.Logger;
13 import net.logstash.logback.appender.LogstashTcpSocketAppender;
14 import net.logstash.logback.encoder.LogstashEncoder;
15 
16 /**
17  * 該類是可以配置成xml配置文件的,但是那樣的話,就不能由客戶端指定參數了
18  */
19 @Component
20 public class LogstashConfig {
21     @Autowired
22     private LogstashProperties logstashProperties;
23 
24     @PostConstruct
25     public void init() {
26         Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
27         LogstashTcpSocketAppender appender = new LogstashTcpSocketAppender();
28         appender.setName("stash");
29         appender.addDestinations(new InetSocketAddress(logstashProperties.getHost(), logstashProperties.getPort()));
30        
31         LogstashEncoder encoder = new LogstashEncoder();
32         encoder.setCustomFields("{ \"service\":\"" + "myboot2" + "\"}");//服務名會在日志中顯示(可以方便的知道該日志是哪個服務的)
33         encoder.start();
34         
35         appender.setEncoder(encoder);
36         appender.setContext(rootLogger.getLoggerContext());
37         appender.start();
38         rootLogger.addAppender(appender);
39         rootLogger.setLevel(Level.toLevel(logstashProperties.getLevel()));
40     }
41 }

注意:

  • init()方法在LogstashConfig bean構建之后執行,之后的日志信息都會寫入到LogstashTcpSocketAppender中去
  • 2、3、4其實也可以沒有,直接使用xml配置即可(參考:https://github.com/logstash/logstash-logback-encoder/tree/logstash-logback-encoder-4.7),但是這樣的話,就無法有我們自己指定logstash參數了,或者需要在xml中指定(這里的配置不在consul中配置),而配在application.properties中(實際上就是配在了consul中)

5、AdviceController.java

 1 private static final Logger LOGGER = LoggerFactory.getLogger(AdviceController.class);
 2 
 3     @RequestMapping(value = "/testLog", method = RequestMethod.GET)
 4     public String testLog() {
 5         LOGGER.info("test info");
 6         LOGGER.debug("test debug");
 7         LOGGER.error("test error");
 8         LOGGER.warn("test warn");
 9         return "test logstash-logback";
10     }

 

二、測試

在上一節的基礎上修改logstash-shipper的配置文件:(輸入為tcp,配置參考:https://github.com/logstash/logstash-logback-encoder/tree/logstash-logback-encoder-4.7

 1 input {
 2     tcp {
 3         mode => "server"
 4         host => "127.0.0.1"
 5         port => 4560
 6         codec => "json_lines"
 7     }
 8 }
 9 
10 filter {
11     
12 }
13 
14 output {
15     redis{
16         data_type => "list"
17         host => ["127.0.0.1:6379"]
18         key => "microservice:logstash:redis"
19     }
20 }

之后運行啟動程序,這時候kibana就會打印出啟動日志了,在日志中有servicename的體現,之后訪問swagger,我們會發現3條不同級別的日志都進入kibana進行展示了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM