前言:由于log-pilot阿里云停止更新之拨,有些不完善的地方贼穆,只能修改容器模板來支持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 是一個智能容器日志采集工具涮帘,它不僅能夠高效便捷地將容器日志采集輸出到多種存儲日志后端拼苍,同時還能夠動態(tài)地發(fā)現(xiàn)和采集容器內(nèi)部的日志文件。 針對前面提出的日志采集難題焚辅,Log-Pilot 通過聲明式配置實現(xiàn)強大的容器事件管理,可同時獲取容器標準輸出和內(nèi)部文件日志苟鸯,解決了動態(tài)伸縮問題同蜻,此外,Log-Pilot 具有自動發(fā)現(xiàn)機制早处,CheckPoint 及句柄保持的機制湾蔓,自動日志數(shù)據(jù)打標,有效應(yīng)對動態(tài)配置砌梆、日志重復(fù)和丟失以及日志源標記等問題默责。 目前 log-pilot 在 Github 完全開源,項目地址是 https://github.com/AliyunContainerService/log-pilot 咸包。您可以深入了解更多實現(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)改不動媒熊,最后覺得用tags的方式判斷很不錯,
? {{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]' #新增正則條件,以日期開頭? 網(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 #你自己鏡像地址 記得私有倉庫需要認證的
? ? ? ? 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 #你自己倉庫地址
? ? ? ? env:
? ? ? ? - name: eureka.instance.hostname
? ? ? ? ? value: springcloud-eureka
? ? ? ? - name: eureka.instance.preferIpAddress
? ? ? ? ? value: "true"
? ? ? ? - name: aliyun_logs_sit-log? ?#當(dāng)然如果你不想使用aliyun這個關(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的名字贷祈,這個定義是關(guān)鍵,不定義這個裙顽,日志是無法輸出到kafka內(nèi)的 我看了源代碼一定要寫 topic key的付燥,java=java 是我們設(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消費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"}? ? #再進行解析
? ? }?
}
output {
#stdout { codec => rubydebug } # 調(diào)試的時候記得打開
if? [java] == "java" { #通過不同的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é)
對于未知的領(lǐng)域不要太害怕勋颖,時間是你本錢,可以慢慢磨勋锤,就怕沒時間饭玲。