ELK是什么以及它收集服务器运行日志的作用
ELK是由Elasticsearch、Logstash和Kibana三个工具组成的一套强大的日志管理和分析平台。收集服务器运行日志就像是给服务器请了个“小秘书”,能把服务器干的事儿都记录下来。这些日志里藏着很多有用的信息,比如服务器啥时候忙啥时候闲,有没有出啥毛病,用户都干了啥操作。有了ELK,我们就能把这些日志整理好、分析好,这样就能让服务器更好地工作,还能及时发现并解决问题。
与操作系统和计算机硬件的交互
- 和操作系统交互:Logstash这个组件就像个勤劳的小蜜蜂,它能跟操作系统说“我要拿日志文件啦”,然后通过操作系统提供的接口,去指定的文件夹里把日志文件拿出来。Elasticsearch和Kibana也会用操作系统的接口来做一些事儿,像读文件、开网络连接啥的。
- 和计算机硬件交互:它们都得用计算机的硬件资源。Elasticsearch分析和存储日志的时候,会用CPU做计算,用内存来临时存数据,用硬盘把数据长久保存起来。Logstash收集日志也得用CPU和内存,Kibana展示日志数据的时候,会通过显卡把数据变成好看的图表在屏幕上显示出来。
ELK包含的部分
- Elasticsearch:它就像一个超级大的图书馆管理员,把日志数据整理得井井有条,还能让我们快速找到想要的日志。它把日志数据存起来,建好多索引,这样我们搜日志的时候就能很快出结果。
- Logstash:是个日志收集小能手,它能从各种地方把日志收集过来,像文件、数据库啥的。它还能把收集到的日志整理一下,去掉没用的部分,把格式变得统一,然后再把日志送给Elasticsearch。
- Kibana:就像一个画家,能把Elasticsearch里的日志数据变成漂亮的图表、报表,让我们一眼就能看懂日志里的信息。
背后做的事情
- Logstash会按照我们定好的规则去收集日志。它先找到日志文件,然后一行一行地读里面的内容。接着,它会用一些规则来检查和修改这些日志,比如把日期格式变得一样,把一些不需要的词去掉。处理完后,它就把日志打包送给Elasticsearch。
- Elasticsearch收到日志后,会给它们建索引。就像给书贴上标签,这样我们搜的时候就能快速找到。它把日志存到硬盘上,这样数据就不会丢啦。
- 当我们想看看日志里有啥信息的时候,就打开Kibana。Kibana会向Elasticsearch发请求,说“我要找这样的日志”。Elasticsearch收到请求后,就开始在它存的日志里找,找到后把结果发给Kibana。Kibana再把这些结果变成好看的图表、报表展示给我们。
使用场景
- 网站监控:能看看用户啥时候访问网站,访问了哪些页面,这样就能知道网站哪里受欢迎,哪里需要改进。
- 服务器性能监控:可以知道服务器的CPU、内存、硬盘用得咋样,要是发现有问题能赶紧解决。
- 安全审计:查看有没有异常的登录、操作,能及时发现可能的安全威胁。
底层原理
- Elasticsearch:用倒排索引的原理。就像字典一样,把日志里的关键词和对应的日志关联起来。我们搜关键词的时候,它能快速找到包含这个关键词的日志。它还能用分布式存储,把数据分散存到好多服务器上,这样又安全又快。
- Logstash:基于事件驱动。有新的日志产生时,就会触发一个事件,然后它就按照我们定的规则处理这个日志。它用各种插件来完成不同的任务,像输入插件负责拿日志,过滤插件负责改日志,输出插件负责把日志送出去。
- Kibana:通过和Elasticsearch的API交流来获取数据。它用前端技术,像HTML、CSS、JavaScript来做出好看的界面和图表。
数据结构和算法
- 数据结构:Elasticsearch里用JSON格式来存日志数据,这就像一个大箱子,里面装着很多小盒子,每个小盒子都有个名字和对应的内容。比如一个日志可能存成这样:
{
"timestamp": "2024-01-01 12:00:00",
"message": "用户登录成功",
"user": "小明"
}
- 算法:Elasticsearch在搜索的时候会用布尔搜索算法,能根据我们的搜索条件,像“包含这个词”“不包含那个词”,快速找到符合条件的日志。Logstash在处理日志的时候会用字符串匹配算法,看看日志里有没有特定的词。
代码示例
下面是一个简单的Logstash配置文件示例,用来收集服务器的日志文件并送到Elasticsearch:
# 输入部分,告诉Logstash从哪里拿日志
input {
file {
# 日志文件的路径,这里要改成你实际的日志文件路径
path => "/var/log/syslog"
# 从文件开头开始读
start_position => "beginning"
}
}
# 过滤部分,对日志进行处理
filter {
# 用grok插件来解析日志内容
grok {
# 匹配日志的格式,这里是一个简单的例子,要根据实际日志格式修改
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{WORD:log_level} %{GREEDYDATA:message}" }
}
}
# 输出部分,把处理后的日志送到哪里
output {
elasticsearch {
# Elasticsearch的地址和端口
hosts => ["localhost:9200"]
# 存到Elasticsearch里的索引名字
index => "server_logs"
}
}
代码解释
- input部分:file插件表示从文件里拿日志,path指定了日志文件的路径,start_position设置从文件开头开始读。
- filter部分:grok插件能把日志内容按照我们定的格式拆开。match里的规则能把日志分成时间戳、日志级别和日志消息三部分。
- output部分:elasticsearch插件把处理后的日志送到Elasticsearch。hosts是Elasticsearch的地址和端口,index是存日志的索引名字。
评论前必须登录!
注册