掌桥专利:专业的专利平台
掌桥专利
首页

一种基于ELK的统一管理k8s环境中应用日志的方法

文献发布时间:2023-06-19 13:26:15


一种基于ELK的统一管理k8s环境中应用日志的方法

技术领域

本发明涉及计算机技术领域,具体涉及统一管理k8s环境中应用日志的方法。

背景技术

随着微服务的流行,越来越多企业选择将传统的单体应用微服务化,同时使用k8s来管理为服务应用,但在享受微服务与k8s带来的各种便利的同时也要承担其带来的困扰,日志就是其中之一,其中,k8s是一个编排容器的工具,也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常方便,而且可以做到故障自愈。虽然行业内大多数都使用ELK来实现统一的日志收集与展示,但由于微服务与k8s的特性,仍然存在如下问题:

第一,应用功能更新频繁,导致每次有新的应用上线时都要去新增对应的日志配置,以便ELK能采集到新增的日志。

第二,日志产生较快,日志文件较大,需要运维人员时刻关注宿主机的磁盘空间情况,如果日志将磁盘空间占满会导致应用异常。

第三,日志进行了统一收集,但是同一个应用有多个实例同时运行,在进行日志查询时无法区分日志来自于哪个宿主机的哪个容器。

公开号为CN110851396A的中国专利文献公开名称为“一种基于建模平台微服务架构统一日志设计方法”的技术,该技术提到在微服务下如何进行统一的日志设计方法,当对于上述三个问题均未能解决,同时该技术以“日志等级”来命名日志文件,此种方式在实际应用中对于使用者无疑是增加排查日志的困难,在一个模块中常规日志、告警日志及错误日志使用的是不同的日志等级,对于一个功能业务会出现不同等级的日志,如果按日志等级命名日志文件,则会将同一个业务的日志分散到不同的文件,在运维或开发人员通过文件查看日志时,会需要同时关注多个文件,降低其通过日志排查问题的效率。

发明内容

本发明的目的是提供一种基于ELK的统一管理k8s环境中应用日志的方法,解决的技术问题:第一,应用功能更新频繁,导致每次有新的应用上线时都要新增对应的日志配置;第二,日志产生较快,日志文件较大,需要运维人员时刻关注宿主机的磁盘空间情况;第三,日志进行了统一收集,但是同一个应用有多个实例同时运行,在进行日志查询时无法区分日志来自于哪个宿主机的哪个容器。

为解决上述技术问题,本发明采用的技术方案陈述如下:一种基于ELK的统一管理k8s环境中应用日志的方法,包括以下步骤:

S01,在k8s中以daemonset方式运行filebeat容器,其中,所述filebeat为用于收集日志的日志收集程序,所述日志必须满足三个规范,即日志内容输出格式规范、日志文件命名规范及日志文件存储位置规范,其中,所述日志内容输出格式规范规定统一的日志内容输出格式必须确保logstash按照约定的规则匹配解析日志,结构化的文本内容可进行结构化拆分,拆分出的日志数据内容至少包含时间、日志级别及日志内容;所述日志文件命名规范规定统一的日志文件命名必须确保在进行日志收集时能匹配到符合命名的所有日志文件;所述日志文件存储位置规范规定将日志统一存储到容器中固定的目录下,将所述目录挂载到宿主机上的固定的目录下,且在所述宿主机上部署filebeat,即部署日志收集程序;

S02,挂载宿主机上的日志目录至所述filebeat容器;

S03,注入所述宿主机的IP地址至所述filebeat容器的环境变量里;

S04,在filebeat的配置文件中使用所述环境变量。

优选地,还包括删除日志的方法,所述删除日志的方法包括以下步骤:

S05,日志删除程序读取filebeat的数据文件;

S06,判断所述数据文件是否读取完成,如是,执行下一步;

S07,判断路径是否包含log-history,若否,执行下一步;

S08,判断日志所在容器是否存活,若否,执行下一步;

S09,删除日志。

优选地,

在所述S06中,如否,则终止日志删除程序的执行;

在所述S07中,如是,则执行删除日志;

在所述S08中,如是,则终止日志删除程序的执行。

优选地,

在所述S01中,所述日志文件分为当前正在写入的文件和按滚动策略生成的历史文件,所述正在写入的文件的命名为“应用名称-#业务分类#-模板标识.log”,所述按滚动策略生成的历史文件的命名为“应用名称-yyyy.MM.dd-索引-#业务分类#-模板标识.log”,其中,所述应用名称表示应用的名称,所述业务分类表示日志所属的业务范畴,所述模板标识表示日志进行解析时需要使用的正则模板,所述yyyy.MM.dd标识当前的年月日,所述索引标识按滚动策略生成的同一种日志文件的索引号,其中所述滚动策略配置为按日期与大小滚动。

优选地,

在所述S01中,将所述宿主机的/u01/logs/${PROJECT_NAME}挂载到容器的/app/logs目录,其中,所述${PROJECT_NAME}为当前应用的名称,在部署容器时通过yaml文件指定,在日志的配置文件中将当前正在写入的文件存储到/app/logs/${CONTAINER_NAME}/目录,将历史文件存储到/app/logs/${CONTAINER_NAME}/log-history/目录,其中,所述${CONTAINER_NAME}为当前容器的名称,在容器启动时会以环境变量的方式注入到当前容器中。

优选地,

在所述S02中,将所述宿主机上/01/logs挂载到所述容器的/app/logs目录,用于读取所有的日志文件内容,/u01/filebeat/data挂载到容器的/usr/share/filebeat/data目录,用于保存每个日志文件当前的读取位置信息到所述宿主机上。

优选地,

所述日志删除程序为python脚本,以k8s的DameonSet的方式运行在宿主机上,在容器中挂载宿主机的/u01/filebeat/data到容器的/filebeat/data目录及宿主机的/u01/logs/到容器的/app/logs目录,在所述python脚本中定时读取/filebeat/data目录中data.json文件内容,所述data.json文件中包含filebeat读取的每个文件的路径及当前读取的位置信息。

通过采用上述技术方案,本发明可达到的有益技术效果陈述如下:本发明采用统一的日志文件命名,该命名能确保在进行日志收集时,能匹配到符合命名规范的所有日志文件,达到一次配置后,后续新增应用的日志自动收集的目的,解决了第一个问题;在本发明中,研发人员通过python开发了日志删除程序,在该程序中需读取filebeat的数据文件,该数据文件记录了filebeat所监视的每个日志文件目前已读取的文件位置及文件路径信息,通过综合分析日志读取的精度,日志文件所在的目录,日志所在容器的存活状态3个信息来判断日志是否可删除,该删除程序可设置为定时执行,一旦日志文件达到删除条件,将会被及时删除,达到节省磁盘资源,保障服务稳定的目的,解决了第二个问题;在k8s中以DaemonSet方式运行一个filebeat容器,将宿主机上的日志目录挂载到该容器内,在该容器的环境变量里注入当前宿主机的IP地址,并在filebeat的配置文件中使用该环境变量,实现标识日志来源自哪个宿主机,解决了第三个问题;本发明实现了对日志的统一及自动化管理,提升了运维效率。

附图说明

图1为本发明的总物理架构图;

图2为本发明日志存储的目录结构图;

图3为本发明的删除日志处理流程图。

具体实施方式

下面结合附图对本发明作进一步说明。

如图1所示,为本发明的总物理架构图,ELK日志分析系统是logstash、elasticsearch、kibana开源软件的集合,对外是作为一个日志管理系统的开源方案,它可以从任何来源、任何格式进行日志搜索、分析与可视化展示。

elasticsearch(es):通过搭建群集存储日志数据,索引日志数据。

logstash:处理日志,对日志进行结构化处理后给es存储。

kibana:视图形式展现日志信息,更加人性化。

日志的处理步骤可以按如下流程进行:首先将日志进行集中化管理,然后将日志格式化(logstash)并输出到elasticsearch,进而对格式化后的数据进行索引和存储(es),最后前端数据的展示(kibana)。

logstash是一款强大的数据处理工具,可实现数据传输、格式处理及格式化输出,同时可实现数据输入(从业务输入)、数据加工(如过滤及改写等)以及数据输出(输出到elasticsearch群集)。

logstash的主要组件包括:

shipper;日志收集者,负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来,通常,远程代理端(agent)只需要运行这个组件即可。

indexer:日志存储者,负责接收日志并写入到本地文件。

broker:日志hub,负责连接多个shipper和多个indexer。

serrch and storage:允许对时间进行搜索和存储。

web interface:基于web的展示界面。

kibana是一个针对elasticsearch的开源分析及可视化平台。

如图1所示,在宿主机上部署了三种程序:

app:业务应用程序。

log—clean:日志删除程序。

filebeat:日志收集程序。

app输出日志到文件后,由本宿主机上的filebeat进行读取,读取后将日志内容发送到消息队列kafka,再由logstash从kafka中消费日志内容进行格式化处理,处理后存储到elasticsearch中,kibana从elasticsearch中读取处理后的日志内容进行可视化展示。log—clean程序会定期删除filebeat已经读取完毕的日志文件。

在本发明中,利用约定的日志规范,结合上述的ELK与日志删除程序,实现对k8s中的应用日志的统一及自动化管理。

如图1和图2所示,本发明提供了一种基于ELK的统一管理k8s环境中应用日志的方法,包括以下步骤:

S01,在k8s中以daemonset方式运行filebeat容器,其中,filebeat为用于收集日志的日志手机程序,日志必须满足三个规范,日志内容输出格式规范,日志文件命名规范及日志文件存储位置规范,如图2所示,日志(应用的)在宿主机上的存储目录结构,所有的日志存储到宿主机上的/u01/logs目录下,再按引用名称,容器名称新建子目录,对于某个应用由于滚动策略产生的滚动日志则存储对应的log—history目录下。

其中,日志内容输出格式规范规定统一的日志内容输出格式必须确保logstash按照约定的规则匹配解析日志,结构化的文本内容可进行结构化拆分,拆分出的日志数据内容至少包含时间、日志级别及日志内容;日志文件命名规范规定统一的日志文件命名必须确保在进行日志收集时能匹配到符合命名的所有日志文件;日志文件存储位置规范规定将日志统一存储到容器中固定的目录下,将目录挂载到宿主机上的固定的目录下,且在宿主机上部署filebeat,即部署日志收集程序。

作为一种具体实现方式,通过制定日志的输出格式,如:[%d{yyyy-MM-dd HH:mm:ss.SSS}]%-5p---[%t]%-40.40logger{40}:%m%n 。

S02,挂载宿主机上的日志目录至filebeat容器。

具体地,在filebeat容器启动时添加-y参数,参数值为/u01/log:/app/logs。

S03,注入宿主机的IP地址至filebeat容器的环境变量里。

具体地,在filebeat的配置文件中使用${HOST_IP}就可以使用容器启动时设置的HOST_IP参数值。

S04,在filebeat的配置文件中使用环境变量。

具体地,具体实现方式是在filebeat容器启动时添加 –e HOST_IP=IP地址,IP地址为当前宿主机的IP地址,如:192.168.1.1。

如图3所示,本基于ELK的统一管理k8s环境中应用日志的方法,还包括删除日志的方法,删除日志的方法包括以下步骤:

S05,日志删除程序读取filebeat的数据文件。

具体地,通过python的读取文件的api将文件内容读取到程序中,再将文件内容转换成json对象,该json对象中存在两个关键的数据项。source:表示读取文件的路径;offset:表示读取文件的当前位置。

S06,判断数据文件是否读取完成,如是,执行下一步,若否,则终止日志删除程序的执行。

具体地,根据source的值,通过python的获取文件状态的api得到文件的大小,再与S05步骤中得到offset比较,如果一致则表示文件读取完成,如果offset小于文件大小则表示文件未读取完成。

S07,判断路径是否包含log—history,若否,执行下一步,若是,则执行删除日志。

具体地,通过判断S05步骤中得到的source值,判断source中是否包含log—history关键字,如果包含说明该文件不会再有新的日志写入。

S08,判断日志所在容器是否存活,若否,执行下一步。

具体地,通过python调用k8s的api,得到当前k8s集群中所有的容器列表,关键实现代码为:ret=K8S_V1_API.list_pod_for_all_namespaces(watch=False),其中,ret表示当前文件的容器名称,通过判断该容器名称是否在ret列表中,如果存在则表示容器存活,如果不存在则表示容器已被删除。

S09,删除日志。关键代码为:os.remove(source),其中source为S05中得到的source。

下面再以logback日志组件为例更进一步的说明本发明的思想。

A、制定日志规范,日志规范是本发明得以实现的前提,规范主要包含三个部分,即即日志内容输出格式规范、日志文件命名规范及日志文件存储位置规范。

a、日志内容输出格式规范,在logback日志组件中,可在配置文件中通过统一的变量来定义日志内容的输出格式,在后续的使用中可直接引用该变量,达到一处修改,多处生效的效果,如,在本实施例中,日志内容输出的格式包含:时间、日志等级、线程名称、类名及日志内容。因为每一条完整的日志都是以时间格式,即yyyy-MM-dd HH:mm:ss.SSS开始,所以在filebeat收集时通过如下正则表达式进行多行日志的匹配配置^\[[0-9]{4}-[0-9]{2}-[0-9]{2}。

b、日志文件命名规范,日志文件分为当前正在写入的文件和按滚动策略生成的历史文件,对于当前正在写入的文件,其命名为“应用名称-#业务分类#-模板标识.log”,对于按滚动策略生成的历史文件,其命名为“应用名称-yyyy.MM.dd-索引-#业务分类#-模板标识.log”,其中“应用名称”表示该应用的名称,“业务分类”表示该日志所属的业务范畴,可以将同一种业务的日志输出到相同的文件中,在elasticsearch中会自动创建一个以“应用名称-业务分类”为名称的索引,“模板标识”表示对该日志进行解析时需要使用的正则模板,“yyyy.MM.dd”表示当前的年月日,“索引”表示按滚动策略生成的同一种日志文件的索引号,其中,滚动策略配置为按日期与大小滚动。

c、如图2所示,日志文件存储位置规范,在k8s中应用都以容器的方式运行,需挂载宿主机的日志目录到容器中,以防止容器退出时,出现日志丢失问题,如将宿主机的/u01/logs/${PROJECT_NAME}挂载到容器的/app/logs目录,其中,${PROJECT_NAME}为当前应用的名称,在部署容器时听过yaml文件制定,在日志的配置文件中将当前正在写入的文件存储到/app/logs/${CONTAINER_NAME}/目录,将历史文件存储到/app/logs/${CONTAINER_NAME}/log-history/目录,其中,${CONTAINER_NAME}为当前容器的名称,在容器启动时会以环境变量的方式注入到当前容器中。

B、收集及解析日志

在k8s中以daemonset方式运行一个filebeat容器,需将宿主机上/u01/logs挂载到容器的/app/logs目录,用于读取所有的日志文件内容,/u01/filebeat/data挂载到容器的/usr/share/filebeat/data目录,用于保存每个日志文件当前的读取位置信息到宿主机上,同时在该容器的环境变量HOST_IP里注入当前宿主机的IP地址,并在filebeat的配置文件中使用该变量,以实现标识日志来源自哪个宿主机,关键配置陈述如下:

filebeat.inputs:

-type:log

encoding:utf-8

paths:

-/app/logs/*/*/*-#*#-*.log

multiline.pattern: ‘^\[[0-9{4}-[0-9]{2}-[0-9]{2}’

multiline.negate:true

multiline.match:after

fields:

log_src_host:${HOST_IP}

在通过logstash日志解析时,通过分析日志所在的路径即可匹配出应用名称与容器名称,同时通过模板标识来选择对应的正则表达式进行日志内容的字段陪陪,在logstash中可匹配出的结构化数据有:宿主机IP,容器名称,应用名称,业务分类,时间,日志等级,线程名称,类名,日志内容,然后将匹配出的内容写入到ES的“应用名称-业务分类”索引中。

C、日志删除(通过python脚本实现)

如图3所示,日志删除程序通过python开发,以k8s的dameonset的方式运行在每个宿主机上,在该容器中需挂载宿主机的/u01/filebeat/data到容器的/filebeat/data目录,宿主机的/uo1/logs/到容器的/app/logs目录,在python脚本中实现定时读取/fulebeat/data目录中data.json文件内容,该文件中包含了filebeat读取的每个文件的路径及当前读取的位置信息。

日志删除程序通过以下判断逻辑确定当前文件是否可删除:

1)当前读取的进度是否等于文件的总大小,如果是则进入下一步,否则跳过该文件。

2)当前文件路径中是否包含log-history关键字或者日志文件所属的容器是否已删除,满足任一则进入下一步,否则跳过该文件,具体实现逻辑参照上述S07及S08,判断容器是否删除可通过k8s的api实现。

3)删除文件。

本发明将日志文件按既定的格式命名和存储,再结合删除程序与ELK实现了对日志的统一及自动化管理,提升了运维效率。

相关技术
  • 一种基于ELK的统一管理k8s环境中应用日志的方法
  • 一种基于ELK的日志定时备份方法及系统
技术分类

06120113678499