前言:由于log-pilot阿里云停止更新,有些不完善的地方,只能修改容器模板来支持java多行&json格式数据。我采用log-pilot将日志发到kafka的方式完成我日志采集。
版本:
log-pilot 0.9.5
logstash-6.5.1
kafak-0.10.2
1、log-pilot介绍
log-Pilot 是一个智能容器日志采集工具,它不仅能够高效便捷地将容器日志采集输出到多种存储日志后端,同时还能够动态地发现和采集容器内部的日志文件。 针对前面提出的日志采集难题,Log-Pilot 通过声明式配置实现强大的容器事件管理,可同时获取容器标准输出和内部文件日志,解决了动态伸缩问题,此外,Log-Pilot 具有自动发现机制,CheckPoint 及句柄保持的机制,自动日志数据打标,有效应对动态配置、日志重复和丢失以及日志源标记等问题。 目前 log-pilot 在 Github 完全开源,项目地址是 https://github.com/AliyunContainerService/log-pilot 。您可以深入了解更多实现原理。
2、改造 log-pilot容器
1)下载log-pilot容器
git pull registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-filebeat
2)修改配置服务的yaml文件
{{range .configList}}
- type: log
enabled: true
paths:
- {{ .HostDir }}/{{ .File }}
scan_frequency: 10s
fields_under_root: true
{{range $key, $value := .Tags}} # 看了很久的源代码,发现改不动,最后觉得用tags的方式判断很不错,
{{if eq $key "java"}} # 如果是tag的key是java就多行采集 和网上的不一样
multiline.pattern: '^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' #新增正则条件,以日期开头 网上抄的
multiline.negate: true #新增 网上抄的
multiline.match: after #新增 网上抄的
multiline.max_lines: 10000 #新增 网上抄的
{{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、配置服务的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 #当然如果你不想使用aliyun这个关键字,Log-Pilot 也提供了环境变量 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的名字,这个定义是关键,不定义这个,日志是无法输出到kafka内的 我看了源代码一定要写 topic key的,java=java 是我们设置的多行采集的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内的数据
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 } # 调试的时候记得打开
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、总结
对于未知的领域不要太害怕,时间是你本钱,可以慢慢磨,就怕没时间。