日志

前边已经学习了各种应用服务、中间件以及数据库等,但他们都有共同的东西,就是日志,日志不光能让你看见这个中间件是否已经启动,还可以看到这个中间件启动的全过程中,更能让你清楚知道运行过程中发生错误的时候,能告诉你这个错误在什么位置,什么时间,什么错误信息等。

如果企业没有类似elk之类的收集日志的工具的话,日志收集还是比较麻烦的,尤其是多集群架构的环境下,得由运维人员登入到每台服务器上,并手动一个一个将日志拉取下来,一点一点查看日志里边的内容,根据日志内容进行排错处理,复现现场问题。

elk解决的就是,能让各主机节点能主动推送日志到es集群服务器中。通过kibana进行可视化的查看和过滤。

什么是日志

日志就是开发者为检测程序执行过程中,会设置程序在执行完某些操作后输出相应的执行结果,该结果通常会记录程序在某个时间点、某个主机或者某个程序上执行的操作以及出现的问题等信息,这些信息就被称为日志。

日志的用途

日志(Log)在各种场景中都有非常重要的作用,尤其在软件开发、系统维护等领域。以下是日志的主要用途:

问题排查与修复

  • 记录错误信息: 当程序或系统出现故障时,日志可以帮助快速定位问题。

  • 跟踪操作流程:通过查看日志了解系统是如何一步步执行的,找到异常行为的起因。

  • 重现问题场景:开发者可以根据日志复现用户遇到的问题,便于修复。

安全审计

  • 追踪用户行为:记录谁在什么时间做了什么操作,有助于发现恶意行为或违规操作。

  • 防止篡改与数据泄露:系统日志可以提供安全证据,帮助管理员判断是否被攻击。

性能分析

  • 记录响应时间:日志可以统计接口响应时间,分析系统瓶颈。

  • 追踪资源使用:了解内存、CPU、数据库查询等资源消耗情况。

合规与法规

  • 很多行业(如金融、医疗等),要求系统保留操作日志至少三年以上,以备查验及追溯。

日志是系统的“黑匣子”,它记录了系统运行中的一切重要行为,是开发、维护、安全的重要工具。

日志的格式

一般日志的格式有: 时间戳+等级+程序名+操作者+正文

日志的等级

日志等级区分:5 个

TRACE(跟踪)

  • 含义:比DEBUG 更详细的跟踪信息,通常用于极端详细的调试。

  • 示例:每一行代码执行轨迹、底层调用堆栈等。

DEBUG(调试)

  • 含义:详细的调试信息,用于开发和排查问题。

  • 示例:变量值、函数调用细节、执行流程追踪。

INFO(信息)

  • 含义:系统的正常运行记录,用于追踪操作过程。

  • 示例:用户登录成功、系统启动完成。

WARN(警告)

  • 含义:可能存在问题,但不会立即影响系统运行。

  • 示例:磁盘空间接近耗尽、使用了弃用的API。

ERROR(错误)

  • 含义:发生了错误,某些功能无法正常工作,但系统还在运行。

  • 示例:用户注册失败,无法写入数据库。

什么是ELK

通俗来讲,ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,

ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案,在这三个软件当中,每个软件用于完成不同的功能,ELK 又称为 ELK stack。

ELK 三个组件相互配合,能够构建一个强大的、可扩展的日志分析平台,支持数据的快速检索、可视化和分析。

00.ELK简介_什么是ELK-CieQ.png

为什么用到ELK:

一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。

常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

ELK的架构图

00.ELK简介_ELK架构图.png

Logstash:具有实时传输能力的数据收集引擎,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通 log、自定义 json 格式的日志解析,最终把经过处理的日志发送给目标存储(如Elasticsearch)。

Elasticsearch: 是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索、支持分布式可实现高可用、提供 API 接口,可以处理大规模日志数据,比如 Nginx、Tomcat、系统日志等。

Kibana: 是为elasticsearch提供一个查看数据的web界面,其主要是通过elasticsearch的API接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。

ElasticSearch背后的小故事

许多年前,一个刚结婚的名叫 Shay Banon (谢伊·巴农)的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。(Lucene是一套用于全文检索搜索的开放源码程序库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜索。Lucene被广泛应用作搜索应用的标准基础库)

直接使用 Lucene 是很难的。因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。他发布了他的第一个开源项目 Compass。

后来 Shay 获得了一份工作,主要是高性能、分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为一个独立的服务并取名 Elasticsearch。

第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名贡献者(目前已经超过 2000 名贡献者)。一家公司已经开始围绕 Elasticsearch 提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。

github:https://github.com/elastic/elasticsearch

据说,Shay 的妻子还在等着她的食谱搜索引擎…。

什么是EFK

由于logstash比较重,并且配置稍微有些复杂,所以出现了EFK的日志收集解决方案。相对于ELK中Logstash,Fluentd采用“一锅端”的形式,可以直接将某些日志文件中的内容存储至ES,然后通过kibana进行展示。其中Fluentd只能收集控制台日志(使用logs命令查出来的日志),不能收集非控制台日志,不能很好的满足生产环境的需求。大部分情况下,没有遵循云原生理念的开发的程序,往往都会输出很多日志文件,这些容器内的日志无法采集,除非在每个pod内添加一个sidecar(边车),将日志文件的内容进行“tail -f"转成控制台日志,但这也非常麻烦的。

EFK最适合的场景就是基于云原生开发的程序。

EFK(Elasticsearch + Fluentd + Kibana)开始流行大概是在 2016~2018年之间,尤其是在 Kubernetes 和云原生架构逐渐成为主流之后。15 年之前还是用 elk,Fluentd 成为 CNCF 项目(2016年),进入可生产状态。Kubernetes 官方文档中 EFK 作为推荐方案。

EFK的架构图

00.ELK简介_EFK架构图.png

Fluentd:是一个开源的日志收集器,用于统一收集、处理和传输日志数据。它可以从各种来源收集数据,并将其发送到目标存储。Fluentd支持灵活的插件系统,使用户可以根据自己的需求进行定制。

Elasticsearch: 是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索、支持分布式可实现高可用、提供 API 接口,可以处理大规模日志数据,比如 Nginx、Tomcat、系统日志等功能。

Kibana: 是为elasticsearch提供一个查看数据的web界面,其主要是通过elasticsearch的API接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。

EFK工作流程

  1. 在Kubernetes集群的每个node节点上起一个Fluentd的Pod,Fluentd配置一个类型为HostPath的volume,将宿主机的文件目录挂载到Fluented容器中。

  1. Fluentd容器根据input模块配置的source(来源)、match(匹配)语法读到宿主机及业务容器的日志文件,再通过filter模块的对日志进行处理,比如格式转换、字段提取、添加标签等。

  1. Fluentd容器把filter模块处理好的日志文件,通过output模块的配置的host送到对应的Elasticsearch集群或Kafka队列中

ELK和EFK的对比

对比项

ELK

EFK

日志收集组件

Logstash

Fluentd

资源消耗

较高(Logstash 基于 JRuby,占资源)

较低(Fluentd 用 C 和 Ruby 写的,较轻量)

插件支持

强大,但偏向复杂

插件丰富,社区支持好

容器化支持(K8s)

一般

很好,Fluentd 更适合在 K8s 里作为 sidecar 使用

配置灵活性

高,但复杂

高且配置文件更简洁

优点

传统架构中比较成熟切很流行

占用资源少,语法简单

缺点

占用资源大,语法相对复杂

只能收集控制台日志,不能收集非控制台中的日志