日志采集不到数据?先看这几步
刚装好日志分析工具,结果面板一片空白,这种情况太常见了。别急着重装,先确认日志文件路径有没有写错。比如 Nginx 的 access.log 默认在 /var/log/nginx/ 下,但有些系统会放在 /logs 或自定义目录里。路径不对,自然读不到。
还有就是权限问题。很多服务日志是 root 写入的,如果你用普通用户运行分析工具,可能根本打不开文件。试着用 sudo tail -f /var/log/app.log 看能不能实时查看,如果不行,基本就是权限卡住了。
解析出来的字段乱七八糟
明明是一条结构清晰的 JSON 日志,导入后却变成一整段 string,没法按 status 或 user_id 过滤。这通常是解析规则没配对。比如 Logstash 用 grok 模式匹配 Nginx 日志,得用 COMBINEDAPACHELOG 才能正确拆分。自己写的正则稍微有点偏差,IP 地址可能被当成字符串,响应时间也提取不出来。
建议先拿几条典型日志做测试,用在线 grok 调试工具预览效果。Kibana 里也有 simulate pipeline 功能,提前验证解析逻辑,省得等半天才发现字段全歪了。
时间戳对不上,差了八小时
这是时区坑。很多日志记录的是 UTC 时间,而你本地系统是东八区,直接展示就晚了八小时。比如凌晨两点的异常登录,在界面上显示成上午十点,排查问题容易跑偏。
解决办法是在解析阶段明确指定时区。Filebeat 或 Logstash 配置里加一句:
date { match => ["timestamp", "yyyy-MM-dd HH:mm:ss"] timezone => "Asia/Shanghai" }这样时间线就对齐了。数据量一大,查询就卡
小项目跑得好好的,上了生产环境,一天几百万条日志,查个错误码要等半分钟。本质是索引策略不合理。默认设置下 Elasticsearch 把所有字段都建全文索引,又慢又占空间。
应该把高频过滤字段(比如 status、path、user_id)设为 keyword 类型,关掉不需要的字段 indexing。另外按天创建索引,配合 curator 定期删旧数据,避免单个索引膨胀到几十 GB。
敏感信息不小心暴露了
调试时顺手把完整请求体打进了日志,里面有手机号、身份证号,结果被分析工具抓进去,存进数据库。一旦平台有漏洞,后果严重。
要在采集层就做脱敏。Logstash 可以用 mutate filter 清洗数据:
mutate {
gsub => [
"message", "\d{11}", "***********"
]
}或者更稳妥的做法,从应用代码层面控制日志输出,不该记的坚决不记。工具再强大,配置不到位也是白搭。多花半小时理清楚流程,比出事后再翻几万行日志强得多。