深色模式
结构化日志 JSON
一行纯文本的日志很难被机器解析。改成 JSON 后,采集端能直接提取
level、trace_id等字段,检索和告警都更精准。本文演示改造要点与验证。
适用环境
bash
# 确认应用当前日志格式(示例:Node 应用)
cat app.log | head -n 3
# 准备 jq 用于验证
which jq1
2
3
4
2
3
4
操作步骤
1. 改造输出为单行 JSON
json
{"ts":"2026-10-09T10:00:00Z","level":"info","service":"order","trace_id":"a1b2c3","msg":"create order success","cost_ms":12}1
2. 以常见语言为例
javascript
// Node.js:用 pino 等结构化日志库
const pino = require('pino')
const logger = pino({ level: 'info' })
logger.info({ service: 'order', trace_id: 'a1b2c3', cost_ms: 12 }, 'create order success')1
2
3
4
2
3
4
python
# Python:用标准 logging + json 格式化
import logging, json
logging.basicConfig(format='%(message)s', level=logging.INFO)
logging.info(json.dumps({"level":"info","service":"order","msg":"ok"}))1
2
3
4
2
3
4
3. 确认采集端按 JSON 解析(Filebeat 示例)
yaml
filebeat.inputs:
- type: filestream
paths: ["/var/log/app.log"]
parsers:
- ndjson:
keys_under_root: true1
2
3
4
5
6
2
3
4
5
6
验证
bash
# 用 jq 验证每行都是合法 JSON
tail -n 100 app.log | jq -c . > /dev/null && echo "全部为合法 JSON"
# 抽取某个字段
tail -n 100 app.log | jq -r 'select(.level=="error") | .msg'1
2
3
4
5
2
3
4
5
常见坑
WARNING
JSON 必须单行、无换行;多行会被 tail 输入拆成多条。异常堆栈需先压缩成单行(如用 \n 转义)再输出。
DANGER
不要把敏感信息(密码、token)写进结构化日志,字段一旦入库很难彻底删除。脱敏应在输出前完成。