shigen
坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。
在上一部分,shigen
讲到了k8s
pod的日志写入ELK的三种技术方案,并在最后展示了一下我实现的效果,那具体的怎么实现呢?今天这一篇文章我们具体的展示一下,先带大家回顾一下上篇文章的效果:
上一篇的地址shigen
会在文章末尾贴出,今天的文章主要是讲解它的集体实现。
ELK的搭建
当我们搭建好了ELK
集群之后,需要着重的修改一下logstash
的配置文件logstash/pipeline/logstash.conf
:
input {tcp {mode => "server"host => "0.0.0.0" port => 50000codec => json_lines}}output {elasticsearch {hosts => "elasticsearch:9200" #es地址index => "springboot-logstash-%{+YYYY.MM.dd}" #写入的索引名user => "elastic" #es用户password => "123456" #es密码}#logstash控制台输入采集到的数据,用于调试stdout {codec => rubydebug}}
这是shigen
本次用到的配置文件,需要注意的是:
- 约定TCP服务的端口是50000,需要在docker-compose中挂载到主机上
- es的地址尽量使用内网或者k8s提供的svc,节省不必要的流量消耗
- 需要安装插件 log stash-codec-json_lines 需要的时间老长了
配置完了启动即可。
搭建spring boot服务
基本的项目结构就不说了,用到了mybatis-plus
作为ORM
框架。我们现在需要的就是把项目的日志输出到logstash
,让它处理完放到elasticsearch
。
配置日志文件
本次的日志框架shigen
选取的是logback
,它需要把日志写入到logstach
,它的途径就是logstash
提供的TCP
端口。
在项目的resource
目录下边新建文件logback-spring.xml
文件,文件内容是这样的:
<?xml version="1.0" encoding="UTF-8"?><configuration><!--指定property属性变量--><property name="log.path" value="./logs/logback-demo"/><property name="destination" value="127.0.0.1:50000"/><property name="appname" value="logdemo"/><!-- 日志输出格式%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n--><!-- 控制台 appender--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset></encoder></appender><!-- 文件 滚动日志 (all)--><appender name="allLog" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 当前日志输出路径、文件名 --><file>${log.path}/all.log</file><!--日志输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset></encoder><!--历史日志归档策略--><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 历史日志: 归档文件名 --><fileNamePattern>${log.path}/%d{yyyy-MM, aux}/all.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><!--单个文件的最大大小--><maxFileSize>64MB</maxFileSize><!--日志文件保留天数--><maxHistory>15</maxHistory></rollingPolicy></appender><!-- 文件 滚动日志 (仅error)--><appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 当前日志输出路径、文件名 --><file>${log.path}/error.log</file><!--日志输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset></encoder><!--历史日志归档策略--><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 历史日志: 归档文件名 --><fileNamePattern>${log.path}/%d{yyyy-MM, aux}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><!--单个文件的最大大小--><maxFileSize>64MB</maxFileSize><!--日志文件保留天数--><maxHistory>15</maxHistory></rollingPolicy><!-- 此日志文档只记录error级别的 level过滤器--><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>error</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 文件 异步日志(async) --><appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"immediateFlush="false" neverBlock="true"><!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --><discardingThreshold>0</discardingThreshold><!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --><queueSize>1024</queueSize><neverBlock>true</neverBlock><!-- 添加附加的appender,最多只能添加一个 --><appender-ref ref="allLog"/></appender><!--输出到logstash的appender--><appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><!--可以访问的logstash日志收集端口--><destination>${destination}</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"><!--自定义字段,区分应用名称--><customFields>{"appname":"logdemo"}</customFields></encoder></appender><!-- root 级别的配置 --><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="ASYNC"/><appender-ref ref="errorLog"/><appender-ref ref="logstash"/></root><!--可输出mapper层sql语句等--><logger name="com.gitee.shigen.logbackspringboot.mapper" level="debug"/><!--输出jdbc 事务相关信息--><logger name="org.springframework.jdbc" level="debug"/></configuration>
注意到我们的其实是有四个目的地的,包括:控制台、文件、logstash以及我们的滚动策略和文件大小超过一定的指标之后的策略。
现在我们只需要启动服务,在kibana
那边持续的观察:
和我们常见的都一样,输出了mybatis-plus
查询的sql语句。我们再来看下kibana
的界面,刚才我们的日志也展示出来了。而且字段很全,自动的帮我们处理了。
后记
也许我们还会存在这样的疑问:这是一个实例的,如果是多实例的,或者一个服务有多个副本怎么办呢?这个shigen
考虑到了,我么可以自定义字段,在我的配置文件中有这个字段:
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"><!--自定义字段,区分应用名称--><customFields>{"appname":"logdemo"}</customFields>
</encoder>
就可以标识出来,在es中也可以一个查询条件,查找相对应地服务日志。
现在还是本地启动,shigen
也会持续输出在k8s
上的服务日志,欢迎持续关注。
以上就是今天分享的全部内容了,觉得不错的话,记得点赞 在看 关注
支持一下哈,您的鼓励和支持将是shigen
坚持日更的动力。同时,shigen
在多个平台都有文章的同步,也可以同步的浏览和订阅:
平台 | 账号 | 链接 |
---|---|---|
CSDN | shigen01 | shigen的CSDN主页 |
知乎 | gen-2019 | shigen的知乎主页 |
掘金 | shigen01 | shigen的掘金主页 |
腾讯云开发者社区 | shigen | shigen的腾讯云开发者社区主页 |
微信公众平台 | shigen | 公众号名:shigen |
与shigen
一起,每天不一样!