日志就像系统的"日记本",记录着系统运行的点点滴滴。对于运维人员来说,日志就是排查问题的"黄金线索"。但当服务器数量增多时,分散在各处的日志就像散落的拼图,难以快速获取完整信息。今天我们就来聊聊如何用 Rsyslog 和 ELK Stack 这套黄金组合,把 Linux 系统的日志集中管理起来,让运维工作事半功倍。

1. 为什么需要日志集中管理?

想象一下,你管理着50台服务器,突然接到用户反馈网站访问异常。你需要排查问题,但日志分散在50台机器上,难道要一台台登录查看吗?这效率太低了!

日志集中管理解决了三大痛点:

  • 查找困难:不用再逐台服务器翻日志
  • 分析不便:可以跨服务器关联分析日志
  • 存储受限:单台服务器的磁盘空间有限

2. 技术方案选型:Rsyslog + ELK Stack

2.1 Rsyslog 简介

Rsyslog 是 Linux 系统自带的日志服务,相比传统的 syslog,它:

  • 支持多种输入输出方式
  • 高性能,每秒可处理百万级日志
  • 支持丰富的过滤和转发规则

2.2 ELK Stack 简介

ELK 是 Elasticsearch、Logstash 和 Kibana 三件套的简称:

  • Elasticsearch:分布式搜索引擎,负责存储和检索日志
  • Logstash:数据处理管道,负责解析和转换日志
  • Kibana:可视化平台,让日志变得直观易懂

3. 实战部署:从零搭建日志系统

3.1 环境准备

假设我们有3台服务器:

  • 日志收集服务器:192.168.1.100(运行Rsyslog)
  • ELK服务器:192.168.1.101
  • 应用服务器:192.168.1.102(产生日志)

3.2 Rsyslog 服务端配置

首先在日志收集服务器(192.168.1.100)上配置 Rsyslog:

# 编辑Rsyslog主配置文件
sudo vim /etc/rsyslog.conf

# 取消以下注释,启用UDP和TCP监听
module(load="imudp")
input(type="imudp" port="514")

module(load="imtcp")
input(type="imtcp" port="514")

# 添加模板,定义接收日志的存储格式
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs

# 重启Rsyslog服务
sudo systemctl restart rsyslog

配置说明

  • imudpimtcp 模块启用网络日志接收功能
  • 模板 RemoteLogs 定义了远程日志的存储路径和格式
  • %HOSTNAME% 会被替换为发送日志的主机名
  • %PROGRAMNAME% 会被替换为产生日志的程序名

3.3 客户端配置

在应用服务器(192.168.1.102)上配置日志转发:

# 编辑Rsyslog配置文件
sudo vim /etc/rsyslog.conf

# 添加以下内容,将所有日志转发到收集服务器
*.* @192.168.1.100:514  # UDP方式
*.* @@192.168.1.100:514 # TCP方式(更可靠)

# 重启Rsyslog服务
sudo systemctl restart rsyslog

小技巧:生产环境建议使用TCP方式(@@),因为UDP可能会丢包。

3.4 ELK Stack 安装与配置

在ELK服务器(192.168.1.101)上安装ELK组件:

# 安装Java环境(ELK依赖)
sudo apt install openjdk-11-jdk

# 下载并安装Elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb
sudo dpkg -i elasticsearch-7.10.2-amd64.deb

# 下载并安装Logstash
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.10.2.deb
sudo dpkg -i logstash-7.10.2.deb

# 下载并安装Kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.10.2-amd64.deb
sudo dpkg -i kibana-7.10.2-amd64.deb

配置Logstash处理Rsyslog收集的日志:

# 创建Logstash配置文件
sudo vim /etc/logstash/conf.d/rsyslog.conf

# 添加以下内容
input {
  file {
    path => "/var/log/*/*.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

filter {
  grok {
    match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{DATA:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:message}" }
  }
  date {
    match => [ "timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "syslog-%{+YYYY.MM.dd}"
  }
}

配置解析

  • input 部分配置从Rsyslog生成的日志文件中读取数据
  • filter 部分使用grok解析syslog格式的日志
  • output 部分将处理后的日志发送到Elasticsearch

4. 高级配置技巧

4.1 日志过滤与分类

有时候我们不需要收集所有日志,可以通过Rsyslog的过滤功能实现:

# 在客户端rsyslog.conf中添加
# 只转发error及以上级别的日志
*.error @192.168.1.100:514

# 排除特定程序的日志
:programname, isequal, "cron" ~  # 忽略cron日志

# 将nginx访问日志单独处理
if $programname == 'nginx' then {
  action(type="omfile" file="/var/log/nginx/access.log")
  stop
}

4.2 日志轮转配置

防止日志文件无限增长,需要配置logrotate:

# 创建logrotate配置
sudo vim /etc/logrotate.d/remote_logs

# 添加以下内容
/var/log/*/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    sharedscripts
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

5. Kibana 可视化配置

安装完成后,访问 http://ELK服务器IP:5601 进入Kibana界面:

  1. 创建索引模式

    • 进入Management → Kibana → Index Patterns
    • 输入 syslog-* 作为索引模式
    • 选择 @timestamp 作为时间字段
  2. 创建可视化图表

    • 进入Visualize → Create new visualization
    • 选择"Data Table"类型
    • 配置聚合条件,如按hostname分组统计日志量
  3. 制作仪表盘

    • 将多个可视化图表组合到一个仪表盘中
    • 可以添加过滤器,如只显示error级别的日志

6. 技术方案优缺点分析

6.1 优势

  1. 高性能:Rsyslog每秒可处理百万级日志条目
  2. 灵活性:支持多种日志格式和传输协议
  3. 可扩展:ELK Stack可以轻松扩展集群规模
  4. 可视化:Kibana提供丰富的可视化选项

6.2 局限性

  1. 资源消耗:Elasticsearch对内存需求较高
  2. 学习曲线:Logstash配置语法需要时间掌握
  3. 维护成本:需要定期维护索引和清理旧数据

7. 应用场景实例

7.1 安全审计

通过集中日志可以:

  • 追踪异常登录尝试
  • 监控敏感文件访问
  • 分析攻击模式

7.2 故障排查

典型案例:

  • 某服务突然崩溃,通过关联多台服务器日志发现是数据库连接池耗尽
  • 网站响应变慢,通过日志分析定位到某个API接口性能下降

7.3 业务分析

非传统用法:

  • 分析用户行为模式
  • 统计系统使用高峰时段
  • 追踪业务流程完成率

8. 注意事项与最佳实践

  1. 日志格式标准化:建议所有应用使用统一的日志格式
  2. 敏感信息过滤:避免在日志中记录密码等敏感信息
  3. 存储规划:根据日志量预估存储需求,通常保留7-30天
  4. 监控日志系统本身:别让日志系统成为单点故障
  5. 权限控制:确保只有授权人员能访问日志数据

9. 总结

通过Rsyslog和ELK Stack的组合,我们构建了一个强大的日志集中管理系统。这套方案不仅解决了日志分散的痛点,还通过强大的搜索和可视化功能,让日志数据真正产生价值。无论是故障排查、安全审计还是业务分析,都能从中受益。

实施时建议从小规模开始,逐步完善过滤规则和可视化方案。记住,一个好的日志系统应该是随着业务需求不断演进的,而不是一蹴而就的。

最后提醒一点:日志系统搭建只是第一步,更重要的是培养团队查看和分析日志的习惯,让数据驱动运维决策。