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
一起,每天不一樣!