日志级别
日志有四种级别,依次是debug,info,warning和error。如果设置为收集info级别日志,则debug级别的信息就不会收集,如果是warning级别,则该级别下的日志就不会收集。具体收集到哪个等级需要按照实际情况,因为日志收集非常的耗费内存。
EFK
对于大型系统,日志需要集中的收集和管理,EFK是目前主流的日志收集管理技术栈之一,包括ElasticResearch\Fluentd\Kibana,Elasticsearch:用于存储和索引日志数据。而Fluentd用于收集处理和转发日志,相比于另一个技术栈ELK中使用的Logstash,Fluentd更加轻量级,因此对于新手使用更加友好,在这里我们使用Fluentd。而Kibana是一个可视化的插件。
具体流程为:
考虑到聚合端(日志处理、清洗等)负载问题和采集端传输效率,一般在日志量比较大的时候在采集端和聚合端增加队列,以用来实现日志消峰。
ELK+filebeat
Logstash是一个比较好的工具,但是不够轻量级,因此如果使用Logstash,一般会结合filebeat使用,filebeat是一个轻量级的日志收集插件,而Logstash仅进行日Logstash 可以作为中央日志处理器,处理来自多个 Filebeat 实例的数据,进行复杂的日志处理和转换。相比纯 ELK 栈,ELK+Filebeat 在日志收集层更轻量高效。相比 EFK (Elasticsearch, Fluentd, Kibana),它保持了 Elastic Stack 的一致性和集成优势。
其他解决方案
Elastic Stack
FileBeat
Filebeat 的工作方式如下:启动 Filebeat 时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于 Filebeat 所找到的每个日志,Filebeat 都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到 libbeat,libbeat 将聚集事件,并将聚集的数据发送到为Filebeat 配置的输出。
Logstash
192.168.1.1 - - [18/Aug/2024:10:00:00 +0000] "GET /index.html HTTP/1.1" 200 1234 "http://example.com" "Mozilla/5.0"
{"timestamp": "2024-08-18T10:05:00", "level": "INFO", "message": "User login successful", "user_id": 12345}
通过logstach的功能进行转换,就可以转换为一致的格式:
input {file {path => "/var/log/apache/access.log"type => "apache"}file {path => "/var/log/app/application.log"type => "application"}
}filter {if [type] == "apache" {grok {match => { "message" => "%{COMBINEDAPACHELOG}" }}date {match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]target => "@timestamp"}mutate {add_field => { "event_type" => "web_access" }}}else if [type] == "application" {json {source => "message"}date {match => [ "timestamp", "ISO8601" ]target => "@timestamp"}mutate {add_field => { "event_type" => "app_log" }}}
}output {elasticsearch {hosts => ["localhost:9200"]index => "unified_logs-%{+YYYY.MM.dd}"}
}
这个配置做了以下工作:
-
定义两个输入源,分别读取Apache日志和应用日志。
-
对于Apache日志:
- 使用grok过滤器解析Combined Log Format。
- 将日期字符串转换为标准时间戳。
- 添加一个"event_type"字段,值为"web_access"
- Logstash 能够动态地转换和解析数据,不受格式或复杂度的影响: 1、利用 Grok 从非结构化数据中派生出结构 2、从 IP 地址破译出地理坐标 3、将 PII 数据匿名化,完全排除敏感字段 ,整体处理不受数据源、格式或架构的影响
-
对于应用日志:
- 使用json过滤器解析JSON格式的日志。
- 将ISO8601格式的时间戳转换为标准时间戳。
- 添加一个"event_type"字段,值为"app_log"。
-
最后,将处理后的数据输出到Elasticsearch,使用统一的索引模式,如下:
{"@timestamp": "2024-08-18T10:00:00.000Z","event_type": "web_access","client_ip": "192.168.1.1","request": "/index.html","response_code": 200,"user_agent": "Mozilla/5.0"
}{"@timestamp": "2024-08-18T10:05:00.000Z","event_type": "app_log","level": "INFO","message": "User login successful","user_id": 12345
}
fluentd
Fluentd 通常比 Logstash 更省资源。这主要是因为 Fluentd 是用 C 和 Ruby 编写的,而 Logstash 是用 Java 编写的。Fluentd 的内存占用通常较小,这在资源受限的环境中是一个明显的优势。