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内部的防火墙,如果不是生产环境最好关闭。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~