如何一步一步搭建基于ELK的容器化日志采集服务

1 容器化日志收集方案

日志系统的重要度不言而喻,开发、测试、用户体验等都与其密切相关。本文以k8s下ELKB日志采集方案为例,详细介绍如何在华为云上一步一步搭建基于ELK的容器化采集服务,并分析在日志采集业务中可能遇到的一些问题。

1.1 ELKB方案说明

日志包含系统日志、应用服务日志、访问日志等,以往若需要查看日志需登录系统设备,通过vim、cat等方式查看,操作繁琐、定位问题困难。费事费力还不能达到理想的效果。因此需要一个集中的统一日志管理分析平台,该系统具有分析统计聚合等功能,并具有用户友好的可视化界面。开源实时分析日志ELK应用而生。

整体日志采集pipeline如下图所示。kubernetes支持两种部署模式:Deployment模式及Daemonset模式。本文使用DaemonSet的方式对每个k8snode部署日志监控收集程序loggingagent(filebeat),并将监控日志实时存储至高性能消息队列kafka。然后使用logstash对kafka日志消息进行消费,同步信息至ES。对于用户可以通过kibana可视化的方式进行数据查询。特别的,考虑到filebeat与k8s兼容的api访问能力,在部署过程中注意需要指定filebeat用户认证。

1.1 日志方案接入组网流程说明

1.2.1 环境准备

  1. 确保已存在可用的虚拟私有云和子网,创建方法请参考创建虚拟私有云和子网。如果您已有虚拟私有云和子网,可重复使用,不需要多次创建。注意根据具体使用合理规划vpc和子网网段,防止网络冲突。值得一提的是,在该日志方案中需要保证各云服务(CCE、DMS、CSS、Logstash)均处于同一VPC下,否则会出现部分服务连接不通的情况。

  2. 确保存在可用的安全组,创建方法,请参考创建安全组。如果您已有安全组,可重复使用,不需要多次创建。在安全组的配置中需要开放以下端口。

  1. 确保各云服务资源配额充足(CCE、DMS、CSS)

1.2.2 日志方案接入流程

  1. 在CCE容器环境中完成需要客户业务的微服务部署,部署方式采用deployment。在k8s中部署deployment及日志收集配置参看:k8s部署deployment配置

  2. 在CCE容器中使用deamonset为各个k8s节点部署logging-agent(filebeat)。在k8s中部署daemonset及相关配置参看:k8S部署daemonset配置

  3. 申请kafka实例,并完成相关配置。具体配置方式参看:kafka实例申请及配置

  4. 申请并安装logstash实例,根据具体业务完成logstash相关配置。请参看:logstash安装及配置

  5. 申请CSS实例,并通过kibana完成日志展示。请参看:CSS实例申请及配置。

2 K8S部署deployment配置

2.1 CCE(云容器引擎)实例申请

完整的云容器引擎使用流程包含以下步骤:

  1. 注册华为云账号,授予IAM用户相应的权限。华为云注册账号无需授权即可拥有所有权限,由华为云账号创建的IAM子用户需要授予相应的权限才能使用CCE,具体请参见权限管理。

  2. 创建kubernetes集群。创建首个集群前,必须先确保已存在虚拟私有云,否则无法创建集群。若已有虚拟私有云,可重复使用,无需重复创建。虚拟私有云为CCE集群提供一个隔离的、用户自主配置和管理的虚拟网络环境。创建方法请参见创建虚拟私有云和子网。创建集群前,请提前规划好容器网段和服务网段。网段参数在集群创建后不可更改,需要重新创建集群才能调整,请谨慎选择。

具体创建界面如下:

首先进入cce服务界面,选择购买kubernetes集群,在弹出界面中可以选择混合集群和鲲鹏集群,本文采用混合集群作为演示。单击混合集群的购买按钮后,进入相关配置选项,根据使用需求分为包年包月和按需计费。其中需要注意请提前规划好容器的网段和服务网段,以免后续出现网络不通或其他异常情况。

完成相关配置后,点击创建节点按钮进入节点创建页面,其中可以选择目标节点规格,根据预估实际使用量来挑选合适的节点规格,并且在集群登录方式上可以选择密码和密钥对两种方式。

设定完成后,单击下一步:安装插件,插件安装可以安装默认,如有额外需求可以根据具体需求进行插件安装,安装完成后确认配置,安装过程需5-6分钟,至此CCE实例申请完成。

2.2 K8S 部署 deployment 及日志收集配置

在CCE容器服务中支持多种部署方式,包括镜像部署、yaml文件部署等。本节将对这两种方式分别进行简述与演示。

2.2.1 容器镜像部署方法

  1. 在CCE左侧导航栏中单击“工作负载>无状态负载Deployment”,单击页面右上角的“创建无状态工作负载”。

  1. 在弹出的界面中,输入想要创建的deployment名字及所属集群名。这里以nginx为例,选择工作负载名称为nginx,并选择该负载所属集群名称,然后选择好部署的命名空间,选择实例数量后,点击容器配置。

  1. 在容器设置页面,点击添加容器。其中在选择镜像时,可以选择开源镜像,若开源镜像中不满足实际需求,可以自行制作第三方镜像,并在该页面中选择制作好的镜像。

  1. 进行容器日志配置。选择容器日志,点击添加日志策略,在此处设置容器日志的存储路径,这里提供了两种日志收集策略,分别是添加主机路径及容器路径。主机路径(HostPath)的方式将主机路径挂载到指定的容器路径中,用户可以在节点的主机路径中查看到容器输出在挂载路径中的日志信息。选择容器路径,则是采用emptyDir的方式,将节点的临时路径挂载到指定的路径下,无需额外指定节点日志路径。一般情况下,推荐采用容器路径方式进行部署。

  1. 选择确定后,按照标准步骤,执行工作负载访问设置,点击添加服务,在本例中,采用nginx服务作为部署案例,容器端口为80,在端口配置中进行配置即可。

  1. 单击“下一步:高级设置”,高级设置不需要配置,单击“创建”。

  2. 待工作负载创建完成后,单击“返回工作负载列表”,在工作负载列表中可查看到运行中的工作负载。至此基于容器镜像部署的工作负载部署完成。

具体使用详情可参看:镜像创建无状态工作负载(Nginx)

2.2.2 Yaml文件部署方法

在CCE中,提供了通过yaml文件进行deployment部署的方式。仍然以nginx为例,最基础的yaml文件如下,其中需要着重注意几个字段:

  • Namespace: 表示部署的命名空间。

  • Volumes应与mountVolumes的name保持一一对应。其中mountVolumes表示容器挂载路径。

示例如下,文件名称为nginx-example.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
	name: nginx
	namespace: xxxx # 需修改为目标命令空间
spec:
	replicas: 1
	selector:
		matchLabels:
			app: nginx
	strategy:
		type: RollingUpdate
	template:
		metadata:
			labels:
				app: nginx
		spec:
			volumes:
				- name: vol-161175527464881854 # 配置了容器部署, 采用emptyDir模式
					emptyDir: {}
		imagePullSecrets:
			- name: default-secret
		containers:
			- name: nginx
				image: 'elastic/filebeat:7.6.2' # 这里采用了filebeat镜像用于测试, 实际使用时替换为实际镜像。
				resources: {}
				volumeMounts:
					- name: vol-161175527464881854
						mountPath: /opt/logs # 挂载路径
						policy:
							logs:
								rotate: Hourly
								annotations:
									pathPattern: '*.log' # 表示收集.log为结尾的
				terminationMessagePath: /dev/termination-log
				terminationMessagePolicy: File
				imagePullPolicy: Always

部署方式演示:

  1. 点击左侧资源管理中的集群管理,选择命令行工具,CCE提供了两种命令行工具分别为webtemernal和kubectl。本文以web-terminal作为测试工具。

  2. 在首次点击web-terminal时会提示需要安装web-terminal插件。按照提示完成相应插件安装,值得注意的是需要为web-terminal绑定弹性IP用于外部连接。

具体界面如下:

  1. 点击访问链接,进入web-terminal,进入后通过vi/touch等方式创建上文中的nginxexample.yaml文件。执行命令kubectlapply–fnginx-example.yaml来完成相关deployment部署。

  2. 执行完成后,同样可以在工作负载页面中看到deployment方式部署的nginx。

  3. 同时在web-terminal通过命令kubectl get pod –n {namespace}来查看容器部署情况,示例如下:

  1. 至此,k8s容器化部署deployment完成。

3 K8S部署daemonSet配置

在上节中完成了deployment容器部署及其容器日志的收集配置。本节主要针对k8s中的daemonset部署方式进行深度分析。

整体部署方式与deployment部署类似。本文以daemonset部署filebeat为例,一般而言,k8s中filebeat部署大致必须包含有几个部分:

ConfigMap

为了降低耦合度及后续的维护难度,创建filebeat容器的时候将filebeat.yml配置文件以configmap的方式实现。用来指定filebeat内部配置(如监控目录、输出类型、是否包含k8s元数据等)

在filebeat.inputs下可以定义监控日志的路径,必须包含有type及paths字段。

ConfigMap样例,需要注意的几个字段:

  • Namespace: 配置为目标容器的命名空间
  • Paths: 配置为filebeat收集日志的路径,若需要采集多个目录,增加inputs即可。
  • Processors: 配置日志收集处理器,如需要采集k8s容器信息,通过-add_kubernetes_metadata增加元数据信息。
  • Output:filbeat支持日志输出至ES、Log
apiVersion: v1
kind: ConfigMap
metadata:
	name: filebeat-config
	namespace: xxxx # 配置为容器的命名空间
	labels:
		k8s-app: filebeat
data:
	filebeat.yml: |-
	filebeat.inputs:
		- type: log
		enable: true
		# 配置filebeat收集日志路径
		paths:
			- /var/lib/*.log
	processors:
	- add_kubernetes_metadata:
		default_indexers.enabled: false
		default_matchers.enabled: false
	# 配置输出至kafka
	output.kafka:
	# initial brokers for reading cluster metadata
		hosts: ["xxxx:9092", "xxx:9092", "xxx:9092"]
	# message topic selection + partitioning
		topic: 'xxxxxxx'
		partition.round_robin:
			reachable_only: false
logging.level: debug

daemonset 方式部署

使用daemonset方式部署filebeat,其中有两个较为重要的参数:volumeMounts及volume,分别指定了filebeat及容器节点的映射路径,其字段为一一对应。

注意以下字段配置:

  • Namespace: 配置为目标命名空间
  • VolumesMount:表示filebeat服务收集日志路径,与volume字段保持一致
  • Volume:表示容器日志收集路径
apiVersion: apps/v1
kind: DaemonSet # 指定daemonset部署
metadata:
	name: filebeat
	namespace: xxxx # 指定namespace
	labels:
		k8s-app: filebeat
spec:
	selector:
		matchLabels:
			k8s-app: filebeat
	template:
		metadata:
			labels:
				k8s-app: filebeat
		spec:
			serviceAccountName: filebeat
			terminationGracePeriodSeconds: 30
			dnsPolicy: ClusterFirstWithHostNet
			containers:
			- name: filebeat
				image: elastic/filebeat:7.6.2 # 指定filebeat镜像版本
				args: [
					"-c", "/etc/filebeat.yml",
					"-e",
				]
				env:
				- name: ELASTICSEARCH_HOST
					value: elasticsearch
				- name: ELASTICSEARCH_PORT
					value: "9200"
				- name: ELASTICSEARCH_USERNAME
					value: elastic
				- name: ELASTICSEARCH_PASSWORD
					value: changeme
				- name: ELASTIC_CLOUD_ID
					value:
				- name: ELASTIC_CLOUD_AUTH
					value:
				- name: NODE_NAME
					valueFrom:
						fieldRef:
							fieldPath: spec.nodeName
				securityContext:
					runAsUser: 0
					# If using Red Hat OpenShift uncomment this:
					# privileged: true
				resources:
					limits:
						memory: 200Mi
					requests:
						cpu: 100m
						memory: 100Mi
					volumeMounts: # 定义卷绑定,固定字段不建议修改,表示filebeat日志收集路径。建议在后增加额外日志收集目录
					- name: config
						mountPath: /etc/filebeat.yml
						readOnly: true
						subPath: filebeat.yml
					- name: data
						mountPath: /usr/share/filebeat/data
					- name: varlibdockercontainers
						mountPath: /var/lib/docker/containers
						readOnly: true
					- name: varlog
						mountPath: /var/log
						readOnly: true
					- name: pod-test
						mountPath: /var/lib/kubelet/pods
						readOnly: true
						volumes: # 与volumeMount字段保持一一对应,表示容器日志收集路径。
					- name: config
						configMap:
							defaultMode: 0640
							name: filebeat-config
					- name: varlibdockercontainers
						hostPath:
							path: /var/lib/docker/containers
					- name: varlog
						hostPath:
							path: /var/log
					- name: pod-test
						hostPath:
							path:/mnt/paas/kubernetes/kubelet/pods
							type:DirectoryOrCreate
					# data folder stores a registry of read status for all files, so we don't send everything again on a Filebeat pod restart
					- name: data
						hostPath:
							# When filebeat runs as non-root user, this directory needs to be writable by group (g+w).
							path: /var/lib/filebeat-data
							type: DirectoryOrCreate

在k8s中可以通过非常易用的yaml文件部署方式进行工作负载部署,这里采用的filebeat的采集器,采用的是7.6.2版本,因为filebeat是对k8s有支持,可以连接api给pod日志打标签,所以yaml中需要进行认证,最后在配置文件中对获取数据采集了之后输入到kafka中,已在yaml中配置好,值得一提的是,该yaml文件中可以根据具体微服务的来绑定不同的日志路径,在filebeat中通过volume及volumeMount字段进行适配。

以下给出基于daemonset方式完整版示例filebeat.yml,在该yaml文件中配置了namespace为ops-monit,filebeat收集/var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/**/*.log该目录下的所有.log文件,其中**表示匹配多级目录,*表示匹配单级目录,通过配置/var/lib/docker/container/**.log来获取k8s的标准输出日志。通过multiLine*参数配置了多行显示,通过fields字段来指定从该目录下收集日志的固定标识用于日志分类处理;在processor字段下配置了收集k8s容器信息,如podId,最终输出至kafka。注意在后还指定了filebeat用户认证:

apiVersion: v1
kind: ConfigMap
metadata:
	name: filebeat-config
	namespace: ops-monit
	labels:
		k8s-app: filebeat
data:
	filebeat.yml: |-
		filebeat.inputs:
		- type: log
			enable: true
			paths:
				- /var/lib/kubelet/pods/*/volumes/kubernetes.io~empty-dir/**/*.log
			# 配置多行显示
			multiline.type: pattern
			multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
			multiline.negate: true
			multiline.match: after
			fields:
				logtype: javalog
		- type: log
			enable: true
			paths:
				- /var/lib/docker/container/*/*.log
			fields:
				logtype: stdlog
		processors:
		- add_kubernetes_metadata:
			default_indexers.enabled: false
			default_matchers.enabled: false
			indexers:
				- pod_uid:
			matchers:
				- logs_path:
					logs_path: '/var/lib/kubelet/pods/'
					resource_type: 'pod'
	# output.logstash:
	# hosts: ["121.37.15.7:5044"]
	# logging.level: debug
	output.kafka:
		# initial brokers for reading cluster metadata
		hosts: ["192.168.0.168:9092", "192.168.0.204:9092", "192.168.0.122:9092"]
		# message topic selection + partitioning
		topic: 'topic-cassmall'
		partition.round_robin:
			reachable_only: false
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
	name: filebeat
	namespace: ops-monit
	labels:
		k8s-app: filebeat
spec:
	selector:
		matchLabels:
			k8s-app: filebeat
	template:
		metadata:
			labels:
				k8s-app: filebeat
		spec:
			serviceAccountName: filebeat
			terminationGracePeriodSeconds: 30
			dnsPolicy: ClusterFirstWithHostNet
			containers:
			- name: filebeat
				image: elastic/filebeat:7.6.2
				args: [
					"-c", "/etc/filebeat.yml",
					"-e",
				]
				env:
				- name: ELASTICSEARCH_HOST
					value: elasticsearch
				- name: ELASTICSEARCH_PORT
					value: "9200"
				- name: ELASTICSEARCH_USERNAME
					value: elastic
				- name: ELASTICSEARCH_PASSWORD
					value: changeme
				- name: ELASTIC_CLOUD_ID
					value:
				- name: ELASTIC_CLOUD_AUTH
					value:
				- name: NODE_NAME
					valueFrom:
						fieldRef:
							fieldPath: spec.nodeName
				securityContext:
					runAsUser: 0
					# If using Red Hat OpenShift uncomment this:
					# privileged: true
				resources:
					limits:
						memory: 200Mi
					requests:
						cpu: 100m
						memory: 100Mi
				volumeMounts:
				- name: config
					mountPath: /etc/filebeat.yml
					readOnly: true
					subPath: filebeat.yml
				- name: data
					mountPath: /usr/share/filebeat/data
				- name: varlibdockercontainers
					mountPath: /var/lib/docker/containers
					readOnly: true
				- name: varlog
					mountPath: /var/log
					readOnly: true
				- name: pod-test
					mountPath: /var/lib/kubelet/pods
					readOnly: true
			volumes:
			- name: config
				configMap:
					defaultMode: 0640
					name: filebeat-config
			- name: varlibdockercontainers
				hostPath:
					path: /var/lib/docker/containers
			- name: varlog
				hostPath:
					path: /var/log
			- name: pod-test
				hostPath:
					path:/mnt/paas/kubernetes/kubelet/pods
					type:DirectoryOrCreate
			# data folder stores a registry of read status for all files, so we don't send everything again on a Filebeat pod restart
			- name: data
				hostPath:
					# When filebeat runs as non-root user, this directory needs to be writable by group (g+w).
					path: /var/lib/filebeat-data
					type: DirectoryOrCreate
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
	name: filebeat
subjects:
- kind: ServiceAccount
	name: filebeat
	namespace: ops-monit
roleRef:
	kind: ClusterRole
	name: filebeat
	apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
	name: filebeat
	labels:
		k8s-app: filebeat
rules:
- apiGroups: [""] # "" indicates the core API group
	resources:
	- namespaces
	- pods
	verbs:
	- get
	- watch
	- list
---
apiVersion: v1
kind: ServiceAccount
metadata:
	name: filebeat
	namespace: ops-monit
	labels:
		k8s-app: filebeat
---

部署成功之后可以在pod里查看相应filebeat容器信息。

查看容器控件命令:

kubectl get pod -n {namespace} -owide

进入容器命令:

kubectl exec -ti filebeat-xxx -n {namespace} bash

至此,k8s部署daemonSet并配置应用日志收集完成。

文末整理了配置过程中常见的一些问题,参考7常见问题。

4 Kafka实例申请及配置

Kafka是一个拥有高吞吐、可持久化、可水平扩展,支持流式数据处理等多种特性的分布式消息流处理中间件,采用分布式消息发布与订阅机制,在日志收集、流式数据传输、在线/离线系统分析、实时监控等领域有广泛的应用。

在日志收集场景中,随着Beats收集的每秒数据量越来越大,若直接使用ELK方案,面对超大型流量突袭,极有可能对logstash及es造成极大的业务压力,最终导致系统崩盘。虽然可以增加Logstash节点数量,一定程度上提高每秒数据的处理速度,但是仍需考虑Elasticsearch可能无法承载这么大量的日志的写入。此时我们可以考虑引入高性能消息队列,对接入日志进行缓存,进而逐渐消费,减低系统的业务压力。

4.1 环境准备

  1. 确保已存在可用的虚拟私有云和子网,创建方法请参考创建虚拟私有云和子网。如果您已有虚拟私有云和子网,可重复使用,不需要多次创建。值得注意的是,创建的VPC与使用的Kafka服务应在相同的区域。

  2. 确保存在可用的安全组,创建方法,请参考创建安全组。如果您已有安全组,可重复使用,不需要多次创建。使用kafka服务时,必须放通以下安全组规则,其他规则请根据实际需要添加。

4.2 创建kafka实例

登录分布式消息服务kafka(DMS)控制台,购买kafka专享版,单击页面右上方的“购买kafka实例”,按照实际情况选择计费模式。按照提示选择好区域和可用区。

在设置实例网络环境信息中,在“虚拟私有云”下拉列表中,选择已经创建好的虚拟私有云,子网及安全组,注意在日志场景中,需要保证各云服务资源(CSS、Logstash、kafka、CCE)在保持在同一个vpc下,且安全组需要放通上述端口。

4.3 创建Topic实例

Topic,即消息主题。创建Kafka专享版实例成功后,如果没有开启“Kafka自动创建Topic”,需要手动创建Topic,然后才能进行生产消息和消费消息。如果实例开启了“Kafka自动创建Topic”,则该操作为可选,在进行生产时,会自动创建一个包含3个分区和3个副本的Topic。

登录分布式消息服务Kafka控制台,选择Kafka实例所在的区域。

在“Kafka专享版”页面,单击Kafka专享版实例的名称。进入实例详情页面。在“Topic管理”页签,单击“创建Topic”。弹出“创建Topic”对话框。填写Topic名称和配置信息,单击“确定”,完成创建Topic。

5 Logstash及Elasticsearch安装及配置

Logstash和Elasticsearch已经集成为华为云云搜索服务,用户可以直接在云搜索服务页面创建Logstash和Elasticsearch不同版本的服务。用户登录华为云开通服务即可。

需要注意,在日志系统搭建过程中,需要虚拟私有云、子网与其他组件保持畅通,安全组注意开放9200(ES)及9300(Kibana)=。

具体使用参看: 云搜索服务 CSS

6 日志系统接入常见问题

6.1 如果在filebeat中需要配置多个日志收集路径,每种日志都有不同的结构,如何做好分词?

在configMap中可以配置多个日志收集路径,如果遇到按podId命名的文件夹,可以采用**(多级目录)/*(单目录)来适配。实例如下:

filebeat.inputs:
	- type: log
		paths:
			- /var/log/containers/*.log
	- type: log
		paths:
			- /var/lib/pod/**/kubernetes~io-empty/*.log

对于分词,可以在logstash中通过grok采用正则过滤,实例格式为(?<fieldName>(.*)

filter {
	grok {
		match => {
			"message" => [
"\[(?<Logtime>(%{MONTHNUM}/%{MONTHDAY}/%{YEAR})\s+%{TIME}\s+%{WORD})\]\s+%{BASE16NUM}\s+(?
<LogSource>([\w|\S]+))\s+%{WORD:LogLevel}\s+(?<LogStr>[\w|\W]*)"
			]
		}
		remove_field => ["message"]
	}
}

6.2 Filebeat如何读取多个日志目录(收集标准输出、spring日志、nginx访问日志等)?

主要涉及几个部分:

  1. filebeat指定监控目录
filebeat.inputs:
	- type: log
		paths:
			- /var/log/containers/*.log
	- type: log
		paths:
			- /var/lib/pod/**/kubernetes~io-empty/*.log
  1. filebeat配置卷绑定注意name,一一对应
volumeMounts:
	- name: filebeat-storage
		mountPath: /var/log/containers
	- name: varlibdockercontainers
		mountPath: /var/lib/docker/containers
volumes:
	- name: filebeat-storage
		hostPath:
			path: /var/log/containers
	- name: varlogpods
  1. logstash配置日志输入输出
  2. deployment配置目录绑定

6.3 Filebeat如何区分不同日志来源?

通过指定field

filebeat.inputs:
	- type: log
		paths:
			- /var/log/containers/*.log
	- fields:
		logtype: container

6.4 如何配置Logstash与Elasticsearch集群通信?

最简单的做法是把集群中所有的Elasticsearch节点的IP或者是hostname信息都在hosts中配上(它支持数组)。但是如果集群比较大,或者是集群节点变动频繁的话,还需要维护这个hosts值,不太方便。比较推荐的做法是只配集群中某个节点的信息,可以是client节点,也可以是master节点或者是data节点。因为不管是哪个节点,都知道该它所在集群的信息(集群规模,各节点角色)。这样,Logstash与任意节点通信时都会先拿到集群信息,然后再决定应该给哪个节点发送数据输出请求

output{
	elasticsearch{
		user => "test-logstash"
		password => "xxxxx"
		hosts => ["http://es-ip1:9200","http://es-ip2:9200","http://es-ip3:9200"]
		index => "testLog-%{+YYYYMMdd}"
		ilm_enabled => false
		manage_template => false
	}
}

6.5 filebeat如何多行日志合并展示(如java错误日志,输出栈信息)?

通过配置multiline*

filebeat.inputs:
	- type: log
		enable: true
		paths:
			- /var/lib/kubelet/*.log
		multiline.type: pattern
		multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
		multiline.negate: true
		multiline.match: after

6.6 如何输出k8s节点信息(日志调试使用pod信息)?

指定processors,在其中增加kubernets元数据

processors:
- add_kubernetes_metadata:
	default_indexers.enabled: false
	default_matchers.enabled: false
	indexers:
		- pod_uid:
	matchers:
		- logs_path:
			logs_path: '/var/lib/kubelet/pods/'
			resource_type: 'pod'

6.7 logstash如何配置多个pipeline输出?

  1. 修改pipeline.yml,增加多个pipelineName

  2. 指定logstash.yml文件路径启动,指定方式:/bin/logstash–path.settings/etc/logstash

6.8 Filebeat文件编码问题

filebeat支撑不同文件格式的编码如果发现es数据是乱码可以查看filebeat导入的源文件格式,选择正确的编码格式输出。

filebeat.inputs:
- type: log
	enabled: true
	encoding: utf-8
	paths:
		- /opt/syslog/security/*.log

文件常用的编码有UTF-8,ISO-8859-1。

ISO-8859-1编码是单字节编码,向下兼容ASCII,是许多欧洲国家使用的编码标准。其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

参考官方文档:

https://www.elastic.co/guide/en/beats/filebeat/7.10/filebeat-input-filestream.html#_encoding_3

6.9 Filebeat 多进程启动

如果我们启动多个filebeat收集不同的日志对接不同的logstash或者es。我们需要指定filebeat的启动data.path路径,data.path记录filebeat设置的元数据信息,文件的偏移量位置等信息。不同的filebeat需要配置不同的data.path路径。

可以通过以下方式启动避免path冲突。

/filebeat -e -c config/service.yml -path.data=/opt/data/service_beat/

启动脚本参考

#!bin/bash

beatpath=/opt/filebeat-7.10.1
configpath=/opt/config
pathdata=/opt/data
logpath=/opt/logs

mkdir -p /opt/logs

#文件名称
configs="springboot-log service-log"

for config in ${configs}
do
	echo "start filebeat for config [ ${config} ] task."
	nohup ${beatpath}/filebeat -e -c ${configpath}/${config}.yml -path.data=${pathdata}/${config}_beat/ >> ${logpath}/${config}_beat.log 2>&1 &
done
echo "start filebeat task success."
(完)