日志管理基础:日志分类、格式与轮转策略
日志这东西,说白了就是系统的「黑匣子」。我干了这么多年运维,每次出故障第一反应就是——查日志。没有日志,你就像蒙着眼睛修飞机,根本无从下手。
今天咱们聊聊日志管理的基础。别小看这些基础,我见过太多团队,日志倒是开了,结果要么格式乱七八糟没法分析,要么磁盘被日志撑爆。嗯,咱们一步步来。
日志分类:别把鸡蛋放在一个篮子里
我个人习惯把日志分成三大类。为什么要分?因为不同日志的用途、保留策略、敏感程度都不一样。
| 分类 | 典型内容 | 用途 | 我踩过的坑 |
|---|---|---|---|
| 系统日志 | 内核消息、服务启停、硬件状态 | 排查系统级故障 | 有一次磁盘满了,系统日志先挂了,结果其他日志也写不进去 |
| 应用日志 | 业务请求、数据库查询、API调用 | 定位业务问题 | 应用日志没做分级,debug信息把磁盘撑爆了 |
| 安全日志 | 登录尝试、权限变更、防火墙阻断 | 安全审计、入侵检测 | 安全日志没单独存,被攻击后日志被攻击者清掉了 |
核心原则:三类日志必须分开存储、分开轮转、分开设置权限。安全日志尤其要写保护,防止被篡改。
你想想看,如果所有日志混在一起,出事了想查个登录记录,得从几TB的debug日志里翻,那效率……我经历过一次,简直噩梦。
日志格式:标准化才能自动化
日志格式这事儿,我刚开始做运维时觉得无所谓,能看就行。直到有一次要对接SIEM平台,才发现日志格式五花八门,解析起来想死的心都有。
Syslog 格式
最经典的日志格式,几乎所有网络设备和Linux系统都支持。说白了就是一行文本,包含时间、主机、进程、消息。
<14>2025-01-15T10:30:00Z webserver01 sshd[12345]: Failed password for root from 192.168.1.100 port 22 ssh2
这里要注意,Syslog的优先级码(那个<14>)包含了设施和级别信息。我建议你统一用RFC 5424格式,比老旧的RFC 3164更规范。
JSON 格式
现在的主流格式。结构清晰,机器解析友好。我个人强烈推荐新系统都用JSON格式输出日志。
{
"timestamp": "2025-01-15T10:30:00Z",
"host": "webserver01",
"process": "sshd",
"pid": 12345,
"level": "ERROR",
"message": "Failed password for root",
"src_ip": "192.168.1.100",
"dst_port": 22,
"protocol": "ssh2"
}
我的习惯:JSON日志一定要包含 @timestamp、host、level、message 这四个字段。这是ELK生态的约定俗成,能省很多事。
CEF 格式
CEF(Common Event Format)是安全设备常用的格式。说白了就是键值对,但有一套标准字段。比如防火墙、IDS/IPS都喜欢用这个。
CEF:0|Security|Firewall|1.0|100|Port Scan Detected|5|src=192.168.1.100 dst=10.0.0.1 dpt=80 proto=tcp
CEF的好处是厂商中立,不同品牌的安全设备都能统一解析。我在做安全审计项目时,经常需要把各种设备的日志转成CEF格式再统一分析。
日志轮转策略:别让日志吃掉磁盘
这个问题我吃过亏。有一次线上服务挂了,查了半天发现是日志把根分区写满了。你想想看,日志本来是帮我们排查问题的,结果它自己成了问题。
日志轮转的核心就三个参数:大小、时间、保留份数。
| 策略 | 适用场景 | 配置示例 | 注意事项 |
|---|---|---|---|
| 按大小轮转 | 日志量波动大的场景 | maxsize 100M | 避免单文件过大,影响读取性能 |
| 按时间轮转 | 合规要求严格的场景 | daily / weekly | 审计要求通常按天保留 |
| 混合策略 | 大多数生产环境 | size 100M + daily | 哪个先触发就轮转 |
我曾经踩过的坑:轮转后的日志文件一定要压缩。我曾经没开压缩,结果轮转出来的历史日志比当前日志还大。另外,轮转脚本要测试,我见过轮转后日志写不进去的惨案。
下面是一个我常用的logrotate配置,你可以参考:
/var/log/app/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
copytruncate
maxsize 100M
dateext
dateformat -%Y%m%d
}
这里解释几个关键点:
- copytruncate:先复制再截断,不影响正在写的进程。我强烈推荐这个,比create方式安全。
- delaycompress:延迟一天压缩,方便当天排查问题。
- dateext:用日期命名,比数字序号直观多了。
知识体系总览
下面这张图是我自己总结的日志管理核心逻辑,你可以对照着理解:
这张图把今天的核心内容串起来了。从上到下看:先分好三类日志,再统一格式,最后配上合理的轮转策略。三层都做好了,日志管理才算及格。
最后说一句:日志管理不是一次性工作。我建议每季度检查一次轮转策略是否合理,磁盘空间是否够用。别等到出事了才想起来看日志——那时候往往已经晚了。
公众号:蓝海资料掘金营,微信deep3321