前言:由于log-pilot阿里云停止更新,有些不完善的地方,只能修改容器模板來(lái)支持java多行&json格式數(shù)據(jù)。我采用log-pilot將日志發(fā)到kafka的方式完成我日志采集。
版本:
? ??????log-pilot??0.9.5
? ? ? ??logstash-6.5.1
? ? ? ? kafak-0.10.2
1、log-pilot介紹
log-Pilot 是一個(gè)智能容器日志采集工具,它不僅能夠高效便捷地將容器日志采集輸出到多種存儲(chǔ)日志后端,同時(shí)還能夠動(dòng)態(tài)地發(fā)現(xiàn)和采集容器內(nèi)部的日志文件。 針對(duì)前面提出的日志采集難題,Log-Pilot 通過(guò)聲明式配置實(shí)現(xiàn)強(qiáng)大的容器事件管理,可同時(shí)獲取容器標(biāo)準(zhǔn)輸出和內(nèi)部文件日志,解決了動(dòng)態(tài)伸縮問(wèn)題,此外,Log-Pilot 具有自動(dòng)發(fā)現(xiàn)機(jī)制,CheckPoint 及句柄保持的機(jī)制,自動(dòng)日志數(shù)據(jù)打標(biāo),有效應(yīng)對(duì)動(dòng)態(tài)配置、日志重復(fù)和丟失以及日志源標(biāo)記等問(wèn)題。 目前 log-pilot 在 Github 完全開(kāi)源,項(xiàng)目地址是 https://github.com/AliyunContainerService/log-pilot 。您可以深入了解更多實(shí)現(xiàn)原理。
2、改造 log-pilot容器
? ? 1)下載log-pilot容器
git pull? registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-filebeat
? ? 2)修改配置服務(wù)的yaml文件
{{range .configList}}
- type: log
? enabled: true
? paths:
? ? ? - {{ .HostDir }}/{{ .File }}
? scan_frequency: 10s
? fields_under_root: true
? {{range $key, $value := .Tags}} # 看了很久的源代碼,發(fā)現(xiàn)改不動(dòng),最后覺(jué)得用tags的方式判斷很不錯(cuò),
? {{if eq $key "java"}} # 如果是tag的key是java就多行采集 和網(wǎng)上的不一樣
? multiline.pattern: '^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' #新增正則條件,以日期開(kāi)頭? 網(wǎng)上抄的
? multiline.negate: true? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #新增 網(wǎng)上抄的
? multiline.match: after? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #新增? 網(wǎng)上抄的
? multiline.max_lines: 10000? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #新增? 網(wǎng)上抄的
? {{end}}
? {{end}}
? {{if .Stdout}}
? docker-json: true
? {{end}}
? {{if eq .Format "json"}}
? json.keys_under_root: true
? {{end}}
? fields:
? ? ? {{range $key, $value := .Tags}}
? ? ? {{ $key }}: {{ $value }}
? ? ? {{end}}
? ? ? {{range $key, $value := $.container}}
? ? ? {{ $key }}: {{ $value }}
? ? ? {{end}}
? tail_files: false
? close_inactive: 2h
? close_eof: false
? close_removed: true
? clean_removed: true
? close_renamed: false
{{end}}
? 3)打包鏡像并推送
????#vim Dockerfile
????FROM registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-filebeat
????COPY filebeat.tpl /pilot/filebeat.tpl
? 這里你自己push哈
3、安裝log-pilot
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
? name: log-pilot
? namespace: kube-system
? labels:
? ? k8s-app: log-pilot
? ? kubernetes.io/cluster-service: "true"
spec:
? template:
? ? metadata:
? ? ? labels:
? ? ? ? k8s-app: log-es
? ? ? ? kubernetes.io/cluster-service: "true"
? ? ? ? version: v1.22
? ? spec:
? ? ? tolerations:
? ? ? - key: node-role.kubernetes.io/master
? ? ? ? effect: NoSchedule
? ? ? serviceAccountName: dashboard-admin
? ? ? containers:
? ? ? - name: log-pilot
? ? ? ? image: registry-vpc.cn-beijing.aliyuncs.com/XXX/log-pilot:0.9.2 #你自己鏡像地址 記得私有倉(cāng)庫(kù)需要認(rèn)證的
? ? ? ? resources:
? ? ? ? ? limits:
? ? ? ? ? ? memory: 200Mi
? ? ? ? ? requests:
? ? ? ? ? ? cpu: 100m
? ? ? ? ? ? memory: 200Mi
? ? ? ? env:
? ? ? ? ? - name: "LOGGING_OUTPUT"
? ? ? ? ? ? value: "kafka"? ? ? ? #輸出到kafka,官方的例子是輸出到es
? ? ? ? ? - name: "KAFKA_BROKERS" #和官方不一致的地方
? ? ? ? ? ? value: "XXX:9092,XXX:9092,XXX:9092" #kafka地址
? ? ? ? ? - name: "NODE_NAME"
? ? ? ? ? ? valueFrom:
? ? ? ? ? ? ? fieldRef:
? ? ? ? ? ? ? ? fieldPath: spec.nodeName
? ? ? ? volumeMounts:
? ? ? ? - name: sock
? ? ? ? ? mountPath: /var/run/docker.sock
? ? ? ? - name: root
? ? ? ? ? mountPath: /host
? ? ? ? ? readOnly: true
? ? ? ? - name: varlib
? ? ? ? ? mountPath: /var/lib/filebeat
? ? ? ? - name: varlog
? ? ? ? ? mountPath: /var/log/filebeat
? ? ? ? securityContext:
? ? ? ? ? capabilities:
? ? ? ? ? ? add:
? ? ? ? ? ? - SYS_ADMIN
? ? ? terminationGracePeriodSeconds: 30
? ? ? volumes:
? ? ? - name: sock
? ? ? ? hostPath:
? ? ? ? ? path: /var/run/docker.sock
? ? ? - name: root
? ? ? ? hostPath:
? ? ? ? ? path: /
? ? ? - name: varlib
? ? ? ? hostPath:
? ? ? ? ? path: /var/lib/filebeat
? ? ? ? ? type: DirectoryOrCreate
? ? ? - name: varlog
? ? ? ? hostPath:
? ? ? ? ? path: /var/log/filebeat
? ? ? ? ? type: DirectoryOrCreate
4、配置服務(wù)的yaml文件
---
apiVersion: apps/v1
kind: Deployment
metadata:
? name: microservice-eureka
? namespace: sit
spec:
? selector:
? ? matchLabels:
? ? ? app: springcloud-eureka
? replicas: 1
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: springcloud-eureka
? ? spec:
? ? ? containers:
? ? ? - name: springcloud-eureka
? ? ? ? image: registry-vpc.cn-beijing.aliyuncs.com/XXXX/microservice-eureka:20200728-d584876 #你自己倉(cāng)庫(kù)地址
? ? ? ? env:
? ? ? ? - name: eureka.instance.hostname
? ? ? ? ? value: springcloud-eureka
? ? ? ? - name: eureka.instance.preferIpAddress
? ? ? ? ? value: "true"
? ? ? ? - name: aliyun_logs_sit-log? ?#當(dāng)然如果你不想使用aliyun這個(gè)關(guān)鍵字,Log-Pilot 也提供了環(huán)境變量 PILOT_LOG_PREFIX可以指定自己的聲明式日志配置前綴,比如 PILOT_LOG_PREFIX: "aliyun,custom",最好是和官方一致,省去多余的配置
? ? ? ? ? value: "/src/logs/console.log"?? #需要收集的日志路徑
? ? ? ? - name: aliyun_logs_sit-log_tags
? ? ? ? ? value: "topic=sit-log,java=java"? #kafka topic的名字,這個(gè)定義是關(guān)鍵,不定義這個(gè),日志是無(wú)法輸出到kafka內(nèi)的 我看了源代碼一定要寫(xiě) topic key的,java=java 是我們?cè)O(shè)置的多行采集的tag
? ? ? ? volumeMounts:
? ? ? ? - mountPath: /src/logs
? ? ? ? ? name: datalog
? ? ? imagePullSecrets:
? ? ? - name: imagehub
? ? ? volumes:
? ? ? - name: datalog
? ? ? ? emptyDir: {}
---
kind: Service
apiVersion: v1
metadata:
? name: springcloud-eureka
? namespace: sit
spec:
? selector:
? ? app: springcloud-eureka
? ports:
? - protocol: TCP
? ? port: 80
? ? targetPort: 8000
? #type: NodePort
5、利用logstash消費(fèi)kafka內(nèi)的數(shù)據(jù)
input {
? kafka {
? ? bootstrap_servers => ["xxx:9092, xxx :9092, xxx :9092"]
? ? #client_id => "sink"
? ? group_id => "sink"
? ? auto_offset_reset => "latest"
? ? consumer_threads => 3
? ? decorate_events => true
? ? topics => ["sit-log"] # 我們上邊配的 ?topic
? ? codec => "json"
}
}
filter
{
? ? if [java] != "java" {? #判斷是不是字段java,方便處理json和java多行
? ? ? json { source => "message"}? ? #再進(jìn)行解析
? ? }?
}
output {
#stdout { codec => rubydebug } # 調(diào)試的時(shí)候記得打開(kāi)
if? [java] == "java" { #通過(guò)不同的tag 指向不同的index
? elasticsearch {
? ? hosts => ["http://172.17.187.169:9200"]
? ? index => "sit-micr-%{+YYYY.MM.dd}"
? ? }
}
if [vytype] == "mobile" {
? elasticsearch {
? ? hosts => ["http://172.17.187.169:9200"]
? ? index => "sit-mobile-%{+YYYY.MM.dd}"
? ? }
}
if [vytype] == "nginx" {
? elasticsearch {
? ? hosts => ["http://172.17.187.169:9200"]
? ? index => "sit-nginx-%{+YYYY.MM.dd}"
? ? }
}
}
6、最后展示一張kibana收集日志的圖例

7、參考博客
https://www.cnblogs.com/uglyliu/p/12382214.html
https://help.aliyun.com/document_detail/86552.html https://github.com/AliyunContainerService/log-pilot/issues/101 https://www.iyunw.cn/archives/k8s-tong-guo-log-pilot-cai-ji-ying-yong-ri-zhi-ding-zhi-hua-tomcat-duo-xing/
8、總結(jié)
對(duì)于未知的領(lǐng)域不要太害怕,時(shí)間是你本錢,可以慢慢磨,就怕沒(méi)時(shí)間。