elk的威名大家都知道,以前前司有專門的人維護,現在換了環境,實在不想上服務器看,所以就摸索下自己搭建,由于現場服務器是需要類似向日葵那樣連接,我還是把日志弄回來,自己本地filebeat上傳到es中
配置文件
沒啥好說的,就是volume 需要根據自己的環境調整。這里的 ". "相當于你的docker-compose.yml文件所在的目錄層級!
- docker-compose
version: '3.2'services:elasticsearch:image: elasticsearch:7.17.4volumes:- ./es/plugins:/usr/share/elasticsearch/plugins #插件文件掛載- ./es/data:/usr/share/elasticsearch/data #數據文件掛載ports:- '9200:9200'- '9300:9300'container_name: elasticsearchrestart: alwaysenvironment:- 'cluster.name=elasticsearch' #設置集群名稱為elasticsearch- 'discovery.type=single-node' #以單一節點模式啟動- 'ES_JAVA_OPTS=-Xms1024m -Xmx1024m' #設置使用jvm內存大小networks:- elklogstash:image: logstash:7.17.4container_name: logstashrestart: alwaysvolumes:- ./logstash/my-logstash.conf:/usr/share/logstash/config/my-logstash.conf- ./logstash/logs:/var/logs/demoports:- '5044:5044/tcp'- '50000:50000/tcp'- '50000:50000/udp'- '9600:9600'environment:LS_JAVA_OPTS: -Xms1024m -Xmx1024mTZ: Asia/ShanghaiMONITORING_ENABLED: falseentrypoint:- logstash- -f- /usr/share/logstash/config/my-logstash.conf links:- elasticsearch:es #可以用es這個域名訪問elasticsearch服務networks:- elkdepends_on:- elasticsearchkibana:image: kibana:7.17.4container_name: kibanarestart: alwaysvolumes:- ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.ymlports:- '5601:5601'links:- elasticsearch:es #可以用es這個域名訪問elasticsearch服務environment:- ELASTICSEARCH_URL=http://elasticsearch:9200 #設置訪問elasticsearch的地址- 'elasticsearch.hosts=http://es:9200' #設置訪問elasticsearch的地址- I18N_LOCALE=zh-CNnetworks:- elkdepends_on:- elasticsearchfilebeat:user: rootimage: elastic/filebeat:7.17.4container_name: filebeatrestart: alwaysvolumes:# 將宿主機目錄掛載到容器中,這個目錄就是我真正放 從服務器上下載spring-boot日志的地方- ./filebeat/logs/elk:/var/logs# 指定配置文件- ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml- ./filebeat/logs:/usr/share/filebeat/logs- ./filebeat/data:/usr/share/filebeat/datalinks:- logstash:logstashcommand: ["--strict.perms=false"]networks:- elk depends_on:- logstash
networks:elk:name: elkdriver:bridge
- logstash 配置
# beats傳入的端口,默認5044
input {beats {port => 5044}
}
filter {grok {pattern_definitions => { "MyTimestamp" => "(\d\d){1,2}-(?:0?[1-9]|1[0-2])-(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])\s+(2[0123]|[01]?[0-9])(:[0-5][0-9])((:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?)\.\d{3}" }match => { "message" => "(?m)%{MyTimestamp:log_create_time}\s+\[%{GREEDYDATA:thread_name}\]\s+%{LOGLEVEL:log-level}\s+%{JAVACLASS:java-class}\s+-%{JAVALOGMESSAGE:message}" }overwrite => ["message"]} date {match => [ "log_create_time","yyyy-MM-dd HH:mm:ss.SSS"]target => "@timestamp"}if "_grokparsefailure" in [tags] {drop { }}
}
# 輸出日志的方式
output {
# 按照日志標簽對日志進行分類處理,日志標簽后續會在filebeat中定義elasticsearch {hosts => ["http://es:9200"]index => "demo"}# 這部分主要是用于本地調試的,prd可以注釋掉
# stdout{# codec=> rubydebug# }
}
- filebeat配置文靜
# 從日志文件輸入日志
filebeat.inputs:
- type: filestreamid: my-filestream-id enabled: trueprospector.scanner.check_interval : 15paths:- /var/logs/*.log# 定義日志標簽,注意當order服務時將該標簽改為order-logparsers:- multiline:type: patternpattern: '^(\d\d){1,2}'negate: truematch: after setup.template.settings:
# 設置主分片數index.number_of_shards: 1
# 因為測試環境只有一個es節點,所以將副本分片設置為0,否則集群會報黃index.number_of_replicas: 0
# 輸出到logstash
output.logstash:
# logstash所在服務器的ip和端口hosts: ["logstash:5044"]
# output.console:
# pretty: true
# enable: true
# 默認配置,不做改動
processors:- add_host_metadata:when.not.contains.tags: forwarded- add_cloud_metadata: ~- add_docker_metadata: ~- add_kubernetes_metadata: ~
遇到的問題
啟動filebeat 遇到的問題
查了下 需要 command: [“–strict.perms=false”] 加上這段,貌似filebeat容器就不會有權限問題了
java異常的多行處理
這個搞了好長時間,文檔上說如果你用了fileBeat 那么就在fileBeat 用 multiline插件處理,而不是在logstash處理
Logstash 中對于message 匹配處理
這個也花了不少時間,首先日志一開始還是GBK的導致日志灌入es 亂碼,所以我這里是調整logback的輸出格式 ,指定charset 為 UTF8
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><encoder>
<!-- <pattern>${FILE_LOG_PATTERN}</pattern>--><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -%msg%n</pattern><charset>UTF-8</charset></encoder><file>${LOG_PATH}/spring-boot-plus.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/spring-boot-plus-%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>${MAX_FILE_SIZE}</maxFileSize><maxHistory>${MAX_HISTORY}</maxHistory></rollingPolicy></appender>
注意你的logstash message處理的格式正是 這里指定的 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -%msg%n 這個格式!!!
如果你有特殊的 格式要處理,可以參考 logstash 官方維護的pattern 倉庫
這里是引用 logstash 官方維護的pattern 倉庫
如果有自定義的格式,比如我這里的時間,折騰我好久,要去kibana debugger 來自己調試
- 如何多次觸發filebeat 將日志采集灌入,只需要手動刪除filebeat下面的registry 目錄即可