简单的日志系统
我还没有用过 ELK 这样的系统(只实验性使用过 Graylog),使用过这些日志管理方案:
- 日志就通过文件存放在服务器上,然后登录服务器进行日志文件分析,排查问题。
- 再进一步就是,将日志文件定期 rsync 到一台服务器上,方便日志管理与日志搜索。
-
服务直接写 syslog,然后配置好 rsyslog 同步就行。
graph LR classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px A(应用程序):::process -->|写入日志| B(syslog 接口):::process B -->|发送日志消息| C(本地 rsyslog 守护进程):::process C -->|存储本地日志| D(本地日志文件):::process C -->|配置转发规则| E{是否转发到远程?}:::process E -->|是| F(通过 UDP/TCP 发送):::process F -->|接收日志消息| G(远程 rsyslog 守护进程):::process G -->|存储远程日志| H(远程日志文件):::process E -->|否| D
-
不要忘了,日志写入数据库在某些场景下也是一个可选方案,比如内部管理系统的登录日志、操作日志等。
理论上日志可以直接写入远程日志系统,但是我想应该不会有线上服务这样做。网络稳定性问题(可能丢失日志、服务阻塞)、性能消耗、增加系统复杂性等。
syslog 是系统提供的日志接口,rsyslog 提供了 TCP 日志可靠传输、本地日志队列功能,而且是 Linux 世界广泛采用的基础服务,我觉得可以接受。
日志系统
-
ELK / EFK:
Elasticsearch # 搜索引擎 Logstash # 日志采集、过滤、预处理 Kabana # 数据可视化 Filebeat # Logstash 替代方案,更加轻量级
graph LR Logs --> Filebeat --> ES Logs --> Logstash --> ES
-
FELK:Filebeat 将日志采集到 Logstash,处理之后导入 ES
graph LR Logs --> Filebeat --> Logstash --> ES
-
FELK + Kafka
Filebeat 将日志采集到 Kafka,再由 Logstash 从 Kafka 读取日志,处理完成之后导入 ES
graph LR Logs --> Filebeat --> Kafka --> Logstash --> ES
-
Graylog:
Filebeat Graylog Sidebar Graylog Elasticsearch MongoDB
-
LPG:
Loki # 搜索引擎 Promtail # 日志采集、过滤、预处理 Grafana # 数据可视化
设计
graph TD
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A(服务):::process -->|生成日志| B(rsyslog):::process
B --> C(Kafka):::process
C --> D(ELK):::process
- 服务写 syslog,通过 rsyslog 同步到
接收,解析,处理,转换,格式化