2、日志采集技术:Agent采集 vs Agentless采集、Syslog协议详解、Windows Event Log采集、Linux rsyslog配置实战

好,咱们进入第二章。日志采集,说白了就是解决「日志怎么到我手里」的问题。

很多新手一上来就纠结:到底用 Agent 还是不用 Agent?我个人的习惯是,先别急着选,先搞清楚你的场景。你想想看,一个几百台服务器的环境,跟一个只有三五台设备的办公室,方案能一样吗?

2.1 Agent 采集 vs Agentless 采集

先说说 Agent 采集。就是在每台机器上装个小程序,由它负责把日志推送到中央服务器。我在项目中遇到过一家金融公司,合规要求特别严,日志必须实时传输,而且不能丢。当时我们选的就是 Agent 方案。

Agent 采集的优点:

  • 灵活:可以自定义采集哪些日志、过滤哪些字段
  • 可靠:自带断点续传、本地缓存,网络断了也不丢日志
  • 安全:可以加密传输,支持认证

缺点也很明显:

  • 每台机器都要装,运维成本高
  • 占用系统资源(CPU、内存)
  • Agent 本身也可能出问题,需要监控

再说 Agentless 采集。说白了就是「我不装东西,你自己把日志送过来」。常见的方式有:通过 Syslog 协议接收、通过 SNMP Trap、或者直接读取远程文件。

Agentless 的优点:

  • 部署简单,不用装客户端
  • 对业务系统零侵入
  • 适合网络设备、安全设备等无法装 Agent 的场景

缺点:

  • 传输可靠性差(UDP 丢包你都不知道)
  • 功能有限,没法做复杂的过滤和解析
  • 安全控制弱,容易被伪造日志

我的建议:

服务器类设备,优先用 Agent。网络设备、防火墙、打印机这些,用 Agentless。混合部署才是常态。

避坑指南:我曾经遇到一个客户,所有设备都用 Syslog UDP 采集,结果网络高峰期丢掉了 30% 的日志,审计的时候根本对不上账。后来全部改成了 TCP 或 Agent 方案。

2.2 Syslog 协议详解

Syslog 是日志界的「普通话」。几乎所有网络设备、Linux 服务器都支持。但说实话,这个协议本身很简陋。

Syslog 的标准格式:

<PRI>Timestamp Hostname AppName PID Message

举个例子:

<34>Oct 11 10:15:30 webserver sshd[1234]: Failed password for root from 192.168.1.100 port 22 ssh2

这里的 <34> 是优先级,由设施代码和严重级别计算得出。我刚开始学的时候老记不住,后来干脆画了个表:

设施代码 含义 常见场景
0 kern 内核日志
1 user 用户进程
2 mail 邮件系统
3 daemon 系统守护进程
4 auth 认证相关(重要!)
5 syslog Syslog 自身
16-23 local0-local7 自定义,留给用户

严重级别(从高到低):

  • 0 - Emergency:系统不可用
  • 1 - Alert:必须立即处理
  • 2 - Critical:严重错误
  • 3 - Error:错误
  • 4 - Warning:警告
  • 5 - Notice:正常但重要
  • 6 - Informational:信息
  • 7 - Debug:调试

优先级计算公式:PRI = 设施代码 * 8 + 严重级别。比如上面例子中的 <34>,就是 4 * 8 + 2 = 34,表示 auth 设施的 Critical 级别。

小技巧:实际工作中,我建议把 local0-local7 留给不同的业务系统。比如 local0 给数据库,local1 给 Web 服务器。这样在日志服务器上可以快速分流。

2.3 Windows Event Log 采集

Windows 的日志系统跟 Linux 完全是两码事。Windows 用 Event Log,日志存在 .evtx 文件里,不是文本格式。

Windows 日志分类:

  • System:系统事件,比如驱动加载、服务启停
  • Security:安全事件,登录成功/失败、权限变更(审计重点!)
  • Application:应用程序日志
  • Setup:安装和配置
  • Forwarded Events:从其他机器收集来的

采集方式:

我常用的有三种:

  1. WMI 查询:远程读取,但慢,适合少量机器
  2. WinRM + PowerShell:效率高,适合批量采集
  3. 第三方 Agent:比如 Winlogbeat,专业、可靠

举个例子,用 PowerShell 远程采集安全日志:

# 远程采集安全日志中登录失败的记录
$cred = Get-Credential
$computers = Get-Content "servers.txt"

foreach ($computer in $computers) {
    Invoke-Command -ComputerName $computer -Credential $cred -ScriptBlock {
        Get-WinEvent -FilterHashtable @{
            LogName   = 'Security'
            ID        = 4625  # 登录失败事件ID
            StartTime = (Get-Date).AddHours(-1)
        } | Select-Object TimeCreated, Message
    }
}

注意:Windows 安全日志默认只记录少量事件。你需要通过组策略开启详细审计策略,比如「审核登录事件」、「审核对象访问」等。我曾经排查一个入侵事件,发现安全日志里啥都没有,就是因为审计策略没开。

2.4 Linux rsyslog 配置实战

Linux 下最主流的日志采集工具就是 rsyslog。它比老旧的 syslogd 强太多了,支持 TCP、TLS、数据库存储、消息队列等等。

基本配置结构:

配置文件在 /etc/rsyslog.conf 或 /etc/rsyslog.d/ 目录下。规则格式很简单:

设施.级别    动作

比如:

# 把所有内核日志写到 /var/log/kern.log
kern.*    /var/log/kern.log

# 把 auth 设施的 info 及以上级别日志发送到远程服务器
auth.info    @192.168.1.100:514

# 用 TCP 发送(两个 @@ 表示 TCP)
auth.info    @@192.168.1.100:514

实战:配置日志集中收集

假设我们要把 Web 服务器的访问日志和错误日志都发到中央日志服务器:

客户端配置(/etc/rsyslog.d/web.conf):

# 使用 local0 设施传输 Apache 访问日志
local0.*    @@192.168.1.100:514

# 使用 local1 设施传输 Apache 错误日志
local1.*    @@192.168.1.100:514

然后在 Apache 配置里,把日志输出到 syslog:

# 在 httpd.conf 或虚拟主机配置中
CustomLog "|/usr/bin/logger -p local0.info -t apache_access" combined
ErrorLog  "|/usr/bin/logger -p local1.err -t apache_error"

服务端配置(/etc/rsyslog.conf):

# 开启 TCP 监听
$ModLoad imtcp
$InputTCPServerRun 514

# 按来源主机和设施分类存储
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%programname%.log"
*.* ?RemoteLogs

关键点:

  • 客户端用 @@(TCP)而不是 @(UDP),避免丢日志
  • 服务端要配置模板,否则所有日志混在一起没法看
  • 记得防火墙放行 514 端口

我的经验:生产环境一定要用 TCP 或 RELP 协议。UDP 虽然快,但丢包了你根本不知道。我曾经帮一个电商平台排查问题,发现凌晨 2 点到 3 点的日志全没了,就是因为 UDP 丢包 + 没人盯着。

嗯,到这里,日志采集的核心技术就讲完了。下一章我们会聊日志解析和标准化——毕竟,日志采回来了,看不懂也是白搭。