SpringBoot 整合 elk

程式設計師果果發表於2019-02-28

一、elk 簡介

  • Elasticsearch是個開源分散式搜尋引擎,它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。

  • Logstash是一個完全開源的工具,他可以對你的日誌進行收集、過濾,並將其儲存供以後使用(如,搜尋)。

  • Kibana 也是一個開源和免費的工具,它Kibana可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助您彙總、分析和搜尋重要資料日誌。

二、elk的安裝

我們採用的 docker 映象安裝。

#下載映象
docker pull sebp/elk
複製程式碼
#啟動映象 , 指定es的記憶體
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 5601:5601 -p 5044:5044 -p 9200:9200 -p 9300:9300 -it --name elk 2fbf0a30426d
複製程式碼

由於sebp/elk中logstash的input的方式預設是filebeat,首先們需要進入elk容器中修改input方式。logstash預設會將etc/logstash/conf.d/中的配置檔案進行整合然後啟動。

#進入容器
docker exec -it elk /bin/bash 
#進入修改目錄
cd etc/logstash/conf.d/
複製程式碼

修改 02-beats-input.conf 檔案,修改如下:

input {    
    tcp {         
        port => 5044         
        codec => json_lines     
        
    } 
    
} 
output{  
    elasticsearch { 
    hosts => ["localhost:9200"] 
    
    } 
    
}
複製程式碼

儲存,退出容器後容器,重啟elk。

docker restart elk
複製程式碼

我們訪問http://127.0.0.1:5601

SpringBoot 整合 elk

三、建立工程

建立工程springboot-elk ,並使用logback 記錄日誌。

1. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.gf</groupId>
	<artifactId>springboot-elk</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>springboot-elk</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<!-- logback -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
		</dependency>

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

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<fork>true</fork>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

複製程式碼

2. 啟動類

@RestController
@SpringBootApplication
public class SpringbootElkApplication {

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

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

	@GetMapping("/{name}")
	public String hi(@PathVariable(value = "name") String name) {
		logger.info( "name = {}" , name );
		return "hi , " + name;
	}
}
複製程式碼

3. logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--該日誌將日誌級別不同的log資訊儲存到不同的檔案中 -->
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />

    <springProperty scope="context" name="springAppName"
                    source="spring.application.name" />

    <!-- 日誌在工程中的輸出位置 -->
    <property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}" />

    <!-- 控制檯的日誌輸出樣式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />

    <!-- 控制檯輸出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!-- 日誌輸出編碼 -->
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 為logstash輸出的JSON格式的Appender -->
    <appender name="logstash"
              class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>127.0.0.1:5044</destination>
        <!-- 日誌輸出編碼 -->
        <encoder
                class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "severity": "%level",
                        "service": "${springAppName:-}",
                        "trace": "%X{X-B3-TraceId:-}",
                        "span": "%X{X-B3-SpanId:-}",
                        "exportable": "%X{X-Span-Export:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "rest": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

    <!-- 日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="logstash" />
    </root>
    
</configuration>
複製程式碼

啟動工程,日誌會存入elasticsearch中,通過Kibana 的web介面,配置後,我們就可看到,下面我簡單的修改下配置。

三、配置 pattern

配置 pattern 輸入*,匹配所有資料。

SpringBoot 整合 elk

選擇時間@timestamp,這樣資料展示會以時間排序

SpringBoot 整合 elk

好了 ,點選discover,就可以看到我們springboot-elk專案的日誌資訊了。

SpringBoot 整合 elk

原始碼下載: github.com/gf-huanchup…

SpringBoot 整合 elk

相關文章