原因:線上日志太多且沒(méi)有長(zhǎng)期保存,導(dǎo)致問(wèn)題發(fā)現(xiàn)晚點(diǎn)就找不到日志了,當(dāng)然可以更改日志保存時(shí)間,但是還有個(gè)問(wèn)題就是不好查詢,需要根據(jù)時(shí)間去查找到底查詢哪個(gè)日志文件,于是想到了用elk收集日志,這樣就好查詢了。
elk是什么
簡(jiǎn)單了解了一下elk是什么,首先elk是三個(gè)中間件。
Elasticsearch:一個(gè)分布式的實(shí)時(shí)搜索和分析引擎,用于存儲(chǔ)和檢索數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù)。
Logstash:收集日志的,比如從一個(gè)日志文件中提取你想要的數(shù)據(jù),實(shí)時(shí)收集等。
Kibana:一個(gè)用于數(shù)據(jù)可視化的工具,提供了強(qiáng)大的圖形化界面,能夠?qū)崟r(shí)地查詢和分析 Elasticsearch 中的數(shù)據(jù),并以圖表、表格等形式展示。
安裝elasticsearch
elk最好都安裝同一版本的,我這里都安裝的7.7.0版本,本來(lái)我安裝的是8版本的,但是這個(gè)版本的安裝要復(fù)雜一些。
docker run --name es -d \
-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
-e "discovery.type=single-node" \
-p 9200:9200 -p 9300:9300 \
-v /home/zh188/elk/es/data:/usr/share/elasticsearch/data \
-v /home/zh188/elk/es/plugins:/usr/share/elasticsearch/plugins \
-v /home/zh188/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
--privileged elasticsearch:7.7.0
解釋
docker run:運(yùn)行容器的命令。
--name es:為容器指定一個(gè)名稱,這里是 "es"。
-d:以分離模式(detached mode)運(yùn)行容器,使其在后臺(tái)運(yùn)行。
-e ES_JAVA_OPTS="-Xms1g -Xmx1g":設(shè)置 Elasticsearch 的 Java 虛擬機(jī)參數(shù)。在這里,設(shè)置了最小堆內(nèi)存 -Xms 為 1GB 和最大堆內(nèi)存 -Xmx 為 1GB。
-e "discovery.type=single-node":設(shè)置 Elasticsearch 的節(jié)點(diǎn)發(fā)現(xiàn)類型為單節(jié)點(diǎn)模式。
-p 9200:9200 -p 9300:9300:將容器的 9200 和 9300 端口映射到主機(jī)的對(duì)應(yīng)端口。9200 端口用于 HTTP 請(qǐng)求,9300 端口用于節(jié)點(diǎn)間通信。
-v /home/zh188/elk/es/data:/usr/share/elasticsearch/data:將主機(jī)上的目錄掛載到容器中,用作 Elasticsearch 存儲(chǔ)數(shù)據(jù)的路徑。
-v /home/zh188/elk/es/plugins:/usr/share/elasticsearch/plugins:將主機(jī)上的目錄掛載到容器中,用于存放 Elasticsearch 插件的路徑。
-v /home/zh188/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:將主機(jī)上的 Elasticsearch 配置文件掛載到容器中,覆蓋默認(rèn)配置。
--privileged:賦予容器特權(quán),可能需要根據(jù)實(shí)際情況使用。
elasticsearch:7.7.0:指定要運(yùn)行的容器鏡像及其版本號(hào)。
默認(rèn)啟動(dòng)連接是不需要賬號(hào)密碼的,如果要設(shè)置密碼可以看看其他博客怎么設(shè)置賬號(hào)秘密。
驗(yàn)證
執(zhí)行一下命令
curl -v http://127.0.0.1:9200
返回這樣的信息表示安裝成功。
安裝kibana
docker run -d --name kibana7 \
-e ELASTICSEARCH_HOSTS=http://本機(jī)ip:9200 \
-p 5601:5601 \
kibana:7.7.0
注意:
ELASTICSEARCH_HOSTS=http://本機(jī)ip:9200
這兒表示連接我們的es,如果是集群的話需要去配置文件里面配置多個(gè)es地址
啟動(dòng)起來(lái)了,在頁(yè)面上訪問(wèn)一下
http://服務(wù)器ip:5601
安裝logstash
如果需要掛載配置文件到宿主機(jī)安裝要稍微麻煩一些,需要先不掛載啟動(dòng),然后把配置文件復(fù)制到你需要掛載的路徑,把容器再刪除,在重啟掛載啟動(dòng)。
不掛載啟動(dòng)
sudo docker run --name logstash \
-p 4560:4560 \
-d logstash:7.7.0
啟動(dòng)完成后復(fù)制配置文件
docker container cp logstash:/usr/share/logstash/config /home/zh188/elk/logstash \
& docker container cp logstash:/usr/share/logstash/pipeline /home/zh188/elk/logstash
注意:/home/zh188/elk/logstash是自己建的文件夾,路徑隨意
停止并刪除容器
docker stop logstash
docker rm logstash
掛載啟動(dòng)
sudo docker run --name logstash \
-p 4560:4560 \
-v /home/zh188/elk/logstash/config:/usr/share/logstash/config \
-v /home/zh188/elk/logstash/pipeline:/usr/share/logstash/pipeline \
-d logstash:7.7.0
啟動(dòng)之后在配置一下es路徑,在掛載的/home/zh188/elk/logstash/config路徑下有個(gè)logstash.yml文件
編輯logstash.yml
http.host: "0.0.0.0"
#xpack.monitoring.elasticsearch.hosts: [ "http://es服務(wù)器ip:9200" ]
配置管道信息
/home/zh188/elk/logstash/pipeline路徑下有個(gè)logstash.conf配置文件
input {
tcp {
port => 9092
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => "192.168.5.188:9200"
index => "hlw-log-index-test-%{+YYYY.MM.dd}"
}
}
解釋
input {
tcp {
port => 9092 //監(jiān)聽(tīng)tcp9092端口
}
}
filter {
json {
source => "message" //將取到的信息json格式化,就是過(guò)濾還有很多其他的過(guò)濾插件
}
}
output {
//向es輸出,索引為hlw-log-index-test-日期,每天新建一個(gè)索引
elasticsearch {
hosts => "192.168.5.188:9200" //ip改為es服務(wù)器ip和端口
index => "hlw-log-index-test-%{+YYYY.MM.dd}"
}
}
注意:我是用docker部署,這兒我監(jiān)聽(tīng)了9092端口,所以我一定要進(jìn)行映射容器9092端口,剛開(kāi)始我就沒(méi)有映射導(dǎo)致一直接受不到消息。
配置logback
引起依賴
springboot已經(jīng)默認(rèn)集成了logback框架,所以無(wú)需在引入logback了,以下依賴是logback和logstash通訊所需的依賴
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.3</version>
</dependency>
配置文件
yml配置文件中加上
logging:
config: classpath:log/logback-spring.xml
在resource中加上log/logback-spring.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級(jí)別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設(shè)置為WARN,則低于WARN的信息都不會(huì)輸出 -->
<!-- scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true -->
<!-- scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。 -->
<!-- debug:當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!--<include resource="org/springframework/boot/logging/logback/base.xml"
/> -->
<contextName>Logback For Boss</contextName>
<!-- name的值是變量的名稱,value的值時(shí)變量定義的值。通過(guò)定義的值會(huì)被插入到logger上下文中。定義變量后,可以使“${}”來(lái)使用變量。 -->
<property name="log.path" value="./logs/hlwserver/path" />
<!-- 定義日志文件 輸入位置 -->
<property name="logDir" value="./logs/hlwserver/" />
<!-- 日志最大的歷史 30天 -->
<property name="maxHistory" value="30" />
<!-- logstash遠(yuǎn)程日志配置-->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.5.188:9092</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<!-- 控制臺(tái)輸出日志 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%cyan(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %logger{36} - %msg%n</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
</appender>
<!-- ERROR級(jí)別單獨(dú)輸出的日志 -->
<appender name="ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}\%d{yyyyMMdd}\error.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
%msg%n</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
<append>true</append>
<prudent>false</prudent>
</appender>
<!-- 所有級(jí)別日志的文件輸出 -->
<appender name="ALL_LOGS"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}\%d{yyyyMMdd}\info.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
%msg%n</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
<append>false</append>
<prudent>false</prudent>
</appender>
<!--文件日志, 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件輸出的文件名-->
<FileNamePattern>${logDir}/%d{yyyyMMdd}/boss.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天數(shù)-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 異步輸出 -->
<appender name="dayLogAsyncAppender" class="ch.qos.logback.classic.AsyncAppender">
<includeCallerData>true</includeCallerData>
<!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿,則會(huì)丟棄TRACT、DEBUG、INFO級(jí)別的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
<queueSize>512</queueSize>
<appender-ref ref="FILE"/>
</appender>
<!--專為 spring 定制
-->
<logger name="org.springframework" level="info"/>
<!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!-- root級(jí)別 DEBUG -->
<root level="INFO">
<!-- 控制臺(tái)輸出 -->
<appender-ref ref="STDOUT" />
<!-- 文件輸出 -->
<appender-ref ref="ERROR" />
<appender-ref ref="ALL_LOGS" />
<appender-ref ref="logstash" />
</root>
</configuration>
主要配置
啟動(dòng)程序就會(huì)有日志,然后去kibana中查看是否有生成的索引。
kibana簡(jiǎn)單使用
查看索引是否建立成功
索引自動(dòng)建立成功并且有數(shù)據(jù),說(shuō)明搭建elk成功,接下來(lái)就看是否有日志信息。
新建索引模式
填入我們的索引名,點(diǎn)擊下一步
創(chuàng)建成功文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-797240.html
查看數(shù)據(jù)
可以看到我們的數(shù)據(jù)日志數(shù)據(jù)已經(jīng)能成功展示了,我們可以檢索了,檢索可以根據(jù)字段,時(shí)間,這樣能更好查看日志了,都看到這里了,點(diǎn)個(gè)贊在走吧。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-797240.html
到了這里,關(guān)于docker搭建elk環(huán)境并實(shí)現(xiàn)logstash監(jiān)聽(tīng)logback,親測(cè)有效!??!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!