一、为什么需要集中收集日志?

想象一下,你管理着几十台服务器,每台服务器都在不停地产生日志文件。当出现问题时,你需要登录每台机器查看日志,这就像在干草堆里找针一样费劲。集中收集日志就是把所有服务器的日志都汇总到一个地方,让你可以一站式查看和分析。

传统方式下,我们需要手动配置每台服务器的日志收集工具,不仅耗时还容易出错。而使用Ansible这样的自动化工具,可以批量、快速地完成这项工作,就像有个机器人助手帮你把所有事情都安排好。

二、Ansible+Filebeat+Logstash组合的优势

这套组合拳有三个关键角色:

  1. Ansible:自动化配置工具,负责把Filebeat安装和配置推送到各服务器
  2. Filebeat:轻量级日志收集器,负责把日志发送给Logstash
  3. Logstash:日志处理中心,负责接收、过滤和转发日志

它们的配合就像工厂的流水线:Ansible是车间主任,Filebeat是运输带,Logstash是质检员。这种分工带来了几个好处:

  • 配置一次,批量部署
  • 资源占用少,不影响业务
  • 扩展性强,加服务器只需改配置

三、手把手配置实战

技术栈说明:本次示例使用Ansible+Filebeat+Logstash+Elasticsearch技术栈

1. 准备Ansible环境

首先确保控制机上安装了Ansible,然后创建目录结构:

mkdir -p ansible-logging/roles/filebeat/{tasks,templates}

2. 编写Ansible主剧本

创建main.yml文件:

---
- hosts: webservers  # 目标服务器组
  become: yes        # 使用sudo权限
  roles:
    - filebeat       # 要执行的角色

3. 配置Filebeat角色

roles/filebeat/tasks/main.yml中添加:

- name: 安装Filebeat
  apt: 
    name: filebeat
    state: present
  when: ansible_os_family == 'Debian'  # 针对Debian系统

- name: 配置Filebeat
  template:
    src: filebeat.yml.j2  # 模板文件
    dest: /etc/filebeat/filebeat.yml
  notify: restart filebeat

- name: 启动Filebeat服务
  service:
    name: filebeat
    state: started
    enabled: yes

4. 创建Filebeat配置模板

roles/filebeat/templates/filebeat.yml.j2中:

filebeat.inputs:
- type: log
  enabled: true
  paths:  # 要收集的日志路径
    - /var/log/nginx/access.log
    - /var/log/nginx/error.log

output.logstash:  # 输出到Logstash
  hosts: ["logstash-server:5044"]

5. 配置Logstash接收端

在Logstash服务器上创建logstash.conf

input {
  beats {
    port => 5044  # 监听端口
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }  # 解析Nginx日志
  }
}

output {
  elasticsearch {  # 输出到Elasticsearch
    hosts => ["http://elasticsearch:9200"]
    index => "nginx-logs-%{+YYYY.MM.dd}"
  }
}

四、实际应用中的技巧与陷阱

实用技巧:

  1. 日志轮转处理:Filebeat会记录文件读取位置,即使日志轮转也不会重复收集
  2. 多行日志合并:Java堆栈跟踪等多行日志可以通过配置合并:
    multiline.pattern: '^\['
    multiline.negate: true
    multiline.match: after
    
  3. 条件部署:可以根据服务器角色动态决定收集哪些日志:
    paths: "{{ log_paths[inventory_hostname] | default(default_logs) }}"
    

常见陷阱:

  1. 权限问题:确保Filebeat有权限读取日志文件
  2. 网络连通性:检查防火墙是否放行5044端口
  3. 资源占用:高流量下Logstash可能需要调整JVM堆大小
  4. 时间戳问题:跨时区服务器要统一时间格式

五、这套方案的适用场景

适合的场景:

  • 需要统一查看多台服务器日志的运维团队
  • 需要分析历史日志趋势的业务部门
  • 需要满足安全审计要求的合规场景

不太适合的场景:

  • 日志量极小(每天<100MB)的单机应用
  • 对实时性要求极高的监控场景(考虑Fluentd)
  • 没有专职运维人员的小团队

六、与其他方案的对比

相比直接使用ELK全家桶,我们的方案有几个不同:

  1. 更轻量:Filebeat比Logstash轻量得多
  2. 更灵活:Ansible可以集成到现有运维体系
  3. 更可控:每个组件都可以单独扩展

与Splunk等商业方案相比:

  • 优点:零成本、完全可控
  • 缺点:需要自己维护,功能没那么丰富

七、性能优化建议

当日志量很大时(每天>10GB),可以考虑:

  1. 分级处理:重要日志实时处理,次要日志批量处理
  2. 负载均衡:部署多个Logstash节点
  3. 压缩传输:启用Filebeat的压缩选项
    compression_level: 3
    
  4. 批量发送:调整批量发送参数
    bulk_max_size: 50
    

八、总结回顾

通过Ansible自动化部署Filebeat+Logstash,我们实现了:

  1. 高效:几分钟完成几十台服务器的配置
  2. 可靠:断点续传确保日志不丢失
  3. 灵活:随时可以调整收集策略

虽然初始搭建需要一些学习成本,但长期来看能大幅提高运维效率。就像给团队配备了一个不知疲倦的日志收集助手,让你可以专注于更有价值的问题分析。