原因:线上日志太多且没有长期保存,导致问题发现晚点就找不到日志了,当然可以更改日志保存时间,但是还有个问题就是不好查询,需要根据时间去查找到底查询哪个日志文件,于是想到了用elk收集日志,这样就好查询了。
elk是什么
简单了解了一下elk是什么,首先elk是三个中间件。
Elasticsearch:一个分布式的实时搜索和分析引擎,用于存储和检索数据,相当于数据库。
Logstash:收集日志的,比如从一个日志文件中提取你想要的数据,实时收集等。
Kibana:一个用于数据可视化的工具,提供了强大的图形化界面,能够实时地查询和分析 Elasticsearch 中的数据,并以图表、表格等形式展示。
安装elasticsearch
elk最好都安装同一版本的,我这里都安装的7.7.0版本,本来我安装的是8版本的,但是这个版本的安装要复杂一些。
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:运行容器的命令。
--name es:为容器指定一个名称,这里是 "es"。
-d:以分离模式(detached mode)运行容器,使其在后台运行。
-e ES_JAVA_OPTS="-Xms1g -Xmx1g":设置 Elasticsearch 的 Java 虚拟机参数。在这里,设置了最小堆内存 -Xms 为 1GB 和最大堆内存 -Xmx 为 1GB。
-e "discovery.type=single-node":设置 Elasticsearch 的节点发现类型为单节点模式。
-p 9200:9200 -p 9300:9300:将容器的 9200 和 9300 端口映射到主机的对应端口。9200 端口用于 HTTP 请求,9300 端口用于节点间通信。
-v /home/zh188/elk/es/data:/usr/share/elasticsearch/data:将主机上的目录挂载到容器中,用作 Elasticsearch 存储数据的路径。
-v /home/zh188/elk/es/plugins:/usr/share/elasticsearch/plugins:将主机上的目录挂载到容器中,用于存放 Elasticsearch 插件的路径。
-v /home/zh188/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:将主机上的 Elasticsearch 配置文件挂载到容器中,覆盖默认配置。
--privileged:赋予容器特权,可能需要根据实际情况使用。
elasticsearch:7.7.0:指定要运行的容器镜像及其版本号。
默认启动连接是不需要账号密码的,如果要设置密码可以看看其他博客怎么设置账号秘密。
验证
执行一下命令
curl -v http://127.0.0.1:9200
返回这样的信息表示安装成功。
安装kibana
docker run -d --name kibana7 \
-e ELASTICSEARCH_HOSTS=http://本机ip:9200 \
-p 5601:5601 \
kibana:7.7.0
注意:
ELASTICSEARCH_HOSTS=http://本机ip:9200
这儿表示连接我们的es,如果是集群的话需要去配置文件里面配置多个es地址
启动起来了,在页面上访问一下
http://服务器ip:5601
安装logstash
如果需要挂载配置文件到宿主机安装要稍微麻烦一些,需要先不挂载启动,然后把配置文件复制到你需要挂载的路径,把容器再删除,在重启挂载启动。
不挂载启动
sudo docker run --name logstash \
-p 4560:4560 \
-d logstash:7.7.0
启动完成后复制配置文件
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
挂载启动
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
启动之后在配置一下es路径,在挂载的/home/zh188/elk/logstash/config路径下有个logstash.yml文件
编辑logstash.yml
http.host: "0.0.0.0"
#xpack.monitoring.elasticsearch.hosts: [ "http://es服务器ip:9200" ]
配置管道信息
/home/zh188/elk/logstash/pipeline路径下有个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 //监听tcp9092端口
}
}
filter {
json {
source => "message" //将取到的信息json格式化,就是过滤还有很多其他的过滤插件
}
}
output {
//向es输出,索引为hlw-log-index-test-日期,每天新建一个索引
elasticsearch {
hosts => "192.168.5.188:9200" //ip改为es服务器ip和端口
index => "hlw-log-index-test-%{+YYYY.MM.dd}"
}
}
注意:我是用docker部署,这儿我监听了9092端口,所以我一定要进行映射容器9092端口,刚开始我就没有映射导致一直接受不到消息。
配置logback
引起依赖
springboot已经默认集成了logback框架,所以无需在引入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"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!--<include resource="org/springframework/boot/logging/logback/base.xml"
/> -->
<contextName>Logback For Boss</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="./logs/hlwserver/path" />
<!-- 定义日志文件 输入位置 -->
<property name="logDir" value="./logs/hlwserver/" />
<!-- 日志最大的历史 30天 -->
<property name="maxHistory" value="30" />
<!-- logstash远程日志配置-->
<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>
<!-- 控制台输出日志 -->
<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级别单独输出的日志 -->
<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>
<!-- 所有级别日志的文件输出 -->
<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>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%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>
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为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级别 DEBUG -->
<root level="INFO">
<!-- 控制台输出 -->
<appender-ref ref="STDOUT" />
<!-- 文件输出 -->
<appender-ref ref="ERROR" />
<appender-ref ref="ALL_LOGS" />
<appender-ref ref="logstash" />
</root>
</configuration>
主要配置
启动程序就会有日志,然后去kibana中查看是否有生成的索引。
kibana简单使用
查看索引是否建立成功
索引自动建立成功并且有数据,说明搭建elk成功,接下来就看是否有日志信息。
新建索引模式
填入我们的索引名,点击下一步
创建成功文章来源:https://www.toymoban.com/news/detail-797240.html
查看数据
可以看到我们的数据日志数据已经能成功展示了,我们可以检索了,检索可以根据字段,时间,这样能更好查看日志了,都看到这里了,点个赞在走吧。文章来源地址https://www.toymoban.com/news/detail-797240.html
到了这里,关于docker搭建elk环境并实现logstash监听logback,亲测有效!!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!