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 | 邮件系统 | |
| 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:从其他机器收集来的
采集方式:
我常用的有三种:
- WMI 查询:远程读取,但慢,适合少量机器
- WinRM + PowerShell:效率高,适合批量采集
- 第三方 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 丢包 + 没人盯着。
嗯,到这里,日志采集的核心技术就讲完了。下一章我们会聊日志解析和标准化——毕竟,日志采回来了,看不懂也是白搭。