Elasticsearch+kibana+logstash 搭建日志收集分析平台


Elasticsearch+kibana+logstash 搭建日志收集分析平台

環境搭建:

虛擬機內存配置:

sysctl -w vm.max_map_count=262144

查看是否調整成功

sysctl -a|grep vm.max_map_count

永久修改:

vi /etc/sysctl.conf

在該conf文件最下方添加一行

vm.max_map_count=262144

elasticsearch配置

這里采用docker來進行部署,首先拉取elasticsearch的鏡像

docker pull elasticsearch:7.16.3

注意: elasticsearch,kibana和logstash最好版本號要一致,避免出現兼容問題。

docker創建elk的網絡

docker network create docker_elk

使用docker run創建elasticsearch容器

docker run -d --name elastic --net docker_elk -p 9200:9200 -p 9300:9300 \

-e "ES_JAVA_OPTS=-Xms64m -Xmx256m" -e "discovery.type=single-node" \

elasticsearch:7.16.3

啟動后,通過docker exec命令進入容器

docker exec -it elastic /bin/bash

進入config文件夾

vi elasticsearch.yml

注意: 由於elasticsearch的官方鏡像采用的是ubuntu系統,所以vi里面的操作方式跟centos有所不同,這里我們需要先移除掉再重新安裝最新的

apt remove vim-common

然后升級

apt update

安裝vim

apt install vim

編輯elasticsearch.yml,開啟xpack認證,個人親身經歷如若不開xpack認證,會出現kibana索引模式無法創建的錯誤,可能跟安全認證有關。在yml文件下面添加以下字段。

xpack.security.enabled: true

xpack.security.transport.ssl.enabled: true

退出容器后,重新啟動容器

docker restart elastic

再次進入容器,設置安全認證密碼。

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

給elasticsearch默認用戶設置密碼,我這邊就設置了123456

設置好后,我們來進行kibana的配置。

kibana配置

先拉取kibana鏡像

docker pull kibana:7.16.3

創建kibana容器

docker run -d --name kibana --net docker_elk -p 5601:5601 kibana:7.16.3

然后接下來我們需要查看一下elasticsearch容器在我們的docker_elk網絡中的地址

docker inspect elastic

在一片配置中下拉到network配置項中

可以看到elasticsearch容器的地址為172.19.0.2

進入kibana容器‘’

docker exec -it kibana /bin/bashw

進入config文件夾

cd config

編輯kibana.yml

server.host: "0.0.0.0"

server.shutdownTimeout: "5s"

elasticsearch.hosts: [ "http://172.19.0.2:9200" ]

monitoring.ui.container.elasticsearch.enabled: true

i18n.locale: "zh-CN"

elasticsearch.username: "elastic"

elasticsearch.password: "123456"

xpack.reporting.encryptionKey: "a_random_string"

xpack.security.encryptionKey: "something_at_least_32_characters"

elasticsearch.host中設置剛才network獲取到的elasticsearch容器地址,然后修改

elasticsearch.password

修改完成后,退出並重啟容器

docker restart kibana

logstash的配置

先拉取鏡像

docker pull logstash:7.16.3

創建logstash 的配置文件

##創建目錄 /data/logstash/config 和 配置文件 logstash.yml

/data/logstash/config/logstash.yml

##創建目錄 /data/logstash/conf.d/ 和配置文件 logstash.conf

/data/logstash/conf.d/logstash.conf

logstash.yml配置如下:

http.host: "0.0.0.0"

xpack.monitoring.elasticsearch.hosts: [ "http://172.19.0.2:9200" ]

xpack.monitoring.enabled: true

path.config: /usr/share/logstash/conf.d/*.conf

path.logs: /var/log/logstash

其中xpack.monitoring.elasticsearch.hosts配置項改為獲取到的elasticsearch容器地址

logstash.conf的配置如下:

input {

 tcp {

 mode => "server"

 host => "0.0.0.0"

 port => 5047

 codec => json_lines

 }

}

output {

 elasticsearch {

 hosts => "172.19.0.2:9200"

 index => "springboot-logstash-%{+YYYY.MM.dd}"

 user => "elastic"

 password => "123456"

 }

}

下面host填寫elastsearch容器地址,index為日志索引的名稱,user和password填寫xpack設置的密碼,port為對外開放收集日志的端口

運行logstash

docker run -it -d -p 5047:5047 -p 9600:9600 \

--name logstash --privileged=true  --net docker_elk -v \

/data/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml -v \

/data/logstash/conf.d/:/usr/share/logstash/conf.d/ logstash:7.16.3

5047端口是剛才port設置的端口

注意: 這里有可能會出現jvm內存棧爆滿

解決方法:

find / -name jvm.options

使用該指令尋找logstash的jvm配置

找到對應容器的配置文件並修改重啟

-Xms128m

-Xmx256m

如果內存大可以適當調高

Springboot配置

在maven中添加Logstash依賴

 <dependency>

 <groupId>net.logstash.logback</groupId>

 <artifactId>logstash-logback-encoder</artifactId>

 <version>6.6</version>

 </dependency>

在resources目錄下創建logback-spring.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="true">



 <!-- 獲取spring配置 -->

 <springProperty scope="context" name="logPath" source="log.path" defaultValue="/app/logdir"/>

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

 <!-- 定義變量值的標簽 -->

 <property name="LOG_HOME" value="${logPath}" />

 <property name="SPRING_NAME" value="${appName}" />



 <!-- 彩色日志依賴的渲染類 -->

 <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>

 <conversionRule conversionWord="wex"

 converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>

 <conversionRule conversionWord="wEx"

 converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>



 <!-- 鏈路追蹤sleuth 格式化輸出 以及 控制台顏色設置變量 -->

 <property name="CONSOLE_LOG_PATTERN"

 value="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) [${appName},%yellow(%X{X-B3-TraceId}),%green(%X{X-B3-SpanId}),%blue(%X{X-B3-ParentSpanId})] [%yellow(%thread)] %green(%logger:%L)   :%msg%n"/>



 <!-- #############################################定義日志輸出格式以及輸出位置########################################## -->

 <!--控制台輸出設置-->

 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

 <pattern>${CONSOLE_LOG_PATTERN}</pattern>

 <!-- <charset>GBK</charset> -->

 </encoder>

 </appender>



 <!--普通文件輸出設置-->

 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

 <FileNamePattern>${LOG_HOME}/log_${SPRING_NAME}_%d{yyyy-MM-dd}_%i.log</FileNamePattern>

 <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

 <maxFileSize>200MB</maxFileSize>

 </timeBasedFileNamingAndTriggeringPolicy>

 </rollingPolicy>

 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

 </encoder>

 </appender>



 <!--aop接口日志攔截文件輸出-->

 <appender name="bizAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">

 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

 <FileNamePattern>/app/log/biz/log_%d{yyyy-MM-dd}_%i.log</FileNamePattern>

 <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

 <maxFileSize>200MB</maxFileSize>

 </timeBasedFileNamingAndTriggeringPolicy>

 </rollingPolicy>

 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

 </encoder>

 </appender>



 <!--開啟tcp格式的logstash傳輸,通過TCP協議連接Logstash-->

 <!--    <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->

 <!--        <destination>10.11.74.123:9600</destination>-->

 <!--        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />-->

 <!--    </appender>-->

 <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">

 <!--可以訪問的logstash日志收集端口-->

 <destination>xxx.xxx.xxx.xxx:5047</destination>

 <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>

 <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">

 <providers>

 <timestamp>

 <timeZone>Asia/Shanghai</timeZone>

 </timestamp>

 <pattern>

 <pattern>

 {

 "app_name":"${SPRING_NAME}",

 "traceid":"%X{traceid}",

 "ip": "%X{ip}",

 "server_name": "%X{server_name}",

 "level": "%level",

 "trace": "%X{X-B3-TraceId:-}",

 "span": "%X{X-B3-SpanId:-}",

 "parent": "%X{X-B3-ParentSpanId:-}",

 "thread": "%thread",

 "class": "%logger{40} - %M:%L",

 "message": "%message",

 "stack_trace": "%exception{10}"

 }

 </pattern>

 </pattern>

 </providers>

 </encoder>

 </appender>



 <!-- #############################################設置輸出日志輸出等級########################################## -->

 <!-- mybatis log configure-->

 <!-- logger設置某一個包或者具體的某一個類的日志打印級別 -->

 <logger name="com.apache.ibatis" level="TRACE"/>

 <logger name="java.sql.Connection" level="DEBUG"/>

 <logger name="java.sql.Statement" level="DEBUG"/>

 <logger name="java.sql.PreparedStatement" level="DEBUG"/>

 <logger name="org.apache.ibatis.logging.stdout.StdOutImpl" level="DEBUG"/>



 <!-- SaveLogAspect log configure外部接口調用-->

 <!-- logger設置某一個包或者具體的某一個類的日志打印級別 -->

 <logger name="com.springweb.baseweb.log.aop.SaveLogAspect" additivity="false" level="INFO">

 <!-- 同時輸出到兩個文件 -->

 <appender-ref ref="bizAppender"/>

 <appender-ref ref="FILE"/>

 </logger>



 <root level="INFO">

 <!-- 默認日志文件輸出 -->

 <appender-ref ref="FILE"/>

 <appender-ref ref="STDOUT"/>



 <!-- 默認日志文件輸出logstash -->

 <appender-ref ref="LOGSTASH"/>

 </root>



</configuration>

destination中填寫部署logstash容器機器的ip地址,如果機器是本地則填寫內網地址,如果是外網服務器,則填寫外網ip,端口要和logstash配置文件中的port一致。

然后我們創建一些測試用例

@RestController

@Slf4j

public class LogController {



 @GetMapping("/test")

 public String showLog(){

 log.warn("日志測試,hahahahah");

 log.info("初始日志");

 log.debug("出現bug啦");

 log.error("出現錯誤");

 return "ok";

 }



}

運行Springboot

注意: 成功啟用logback配置文件后,控制台輸入會有所變化。

spring LOGO上會有logback的配置信息。

如若沒變化,則表明logback配置文件沒生效,沒生效則logstash收集不了日志信息。

kibana查看信息

進入kibana輸入賬號密碼后,來到該界面。

在索引管理中可以看到我們的日志索引。

下方索引模式選項創建索引模式

創建好后,在discover界面上就可以看到我們收集到的日志信息了。

結尾:

如果docker容器啟動一會就自動停止了,大概率是出現錯誤了,這個時候可以使用docker logs 容器名 去查看容器的日志信息來尋找問題。

要注意logstash配置文件的端口要和springboot中logback配置文件中的端口一致

如果是阿里雲或者騰訊雲等雲服務器,注意控制台防火牆也要開放相應端口

注意linux內部的防火牆,如果不是生產環境最好關閉。


免責聲明!

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



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