Debian Node.js 应用日志分析实操指南
一 定位与收集日志
- 常见日志位置与来源
- 应用自定义路径:如 /var/log/nodejs/、/var/log/myapp/ 或项目目录下的 logs/;也可能由环境变量指定(如 LOG_PATH)。
- 进程管理日志:使用 systemd 时,用 journalctl -u your-service-name 查看 stdout/stderr 与守护进程日志。
- 进程管理工具:如使用 PM2,日志通常在项目目录的 logs/ 或通过 pm2 logs 查看。
- 建议做法
- 统一日志目录与权限,便于集中采集与轮转。
- 在代码中显式配置日志路径与级别,避免仅依赖控制台输出。
二 命令行快速分析
- 实时查看与检索
- 实时跟踪:tail -f /path/to/app.log
- 关键字过滤:grep “ERROR” /path/to/app.log
- 字段提取与筛选(示例按空格分隔,取第1与第7字段):awk ‘{print $1,$7}’ /path/to/app.log
- 统计与去重
- 唯一计数:sort | uniq -c
- 数值逆序排序:sort -n -r
- 时间范围筛选(示例筛选包含 2025-12-06 的 ERROR)
- awk ‘{print $1,$2,$3,$4}’ app.log | grep ‘ERROR’ | grep ‘2025-12-06’
- 文本处理
- 删除包含某关键字的行:sed ‘/Deprecated/d’ app.log
- 组合示例:统计最近 1000 行中 ERROR 的 Top N
- tail -n 1000 app.log | grep ‘ERROR’ | sort | uniq -c | sort -rn | head -n 20
三 结构化日志与性能分析
- 使用结构化日志
- 采用 JSON 格式(如 winston、pino、bunyan),便于按字段检索与聚合。
- 在 Express 中结合 morgan 输出请求日志,配合文件或控制台传输。
- 设置合理的日志级别
- 开发环境可用 debug/info,生产环境建议 warn/error;可通过环境变量(如 WINSTON_LEVEL、PINO_LEVEL)动态调整。
- 从日志提取性能指标
- 关注 响应时间、请求量、错误率 等关键指标;将日志输出到集中平台(如 ELK/Graylog/Fluentd)便于可视化与告警。
- 示例(winston 结构化 + 按级别输出)
- 安装:npm i winston
- 配置:
- const winston = require(‘winston’);
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || ‘info’,
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }),
new winston.transports.File({ filename: ‘combined.log’ })
]
});
- 示例(morgan 记录 HTTP 请求)
- const morgan = require(‘morgan’);
app.use(morgan(‘combined’)); // 或自定义格式 )
四 日志轮转与集中化
- 日志轮转(避免磁盘被占满)
- 使用 logrotate 管理日志生命周期,示例配置:
- /path/to/your.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
- 集中化与可视化
- 小规模可用 ELK Stack(Elasticsearch/Logstash/Kibana) 或 Graylog;多机部署建议配合 Filebeat/Fluentd 采集。
- 监控与告警:结合 Prometheus + Grafana 对错误率、延迟等指标做可视化与阈值告警。
五 高效排查清单
- 服务是否存活与启动参数是否正确:journalctl -u your-service-name -b
- 最近错误与异常堆栈:tail -n 200 app.log | grep -i error
- 某时间段的错误 Top N:awk ‘{print $1,$2,$3,$4}’ app.log | grep ‘ERROR’ | grep ‘2025-12-06’ | sort | uniq -c | sort -rn | head
- 请求耗时分布(假设第8字段为响应时间 ms):awk ‘$8 ~ /^[0-9]+$/ {print $8}’ app.log | sort -n | tail -n 20
- 是否存在异常重复日志:grep ‘timeout’ app.log | sort | uniq -c | sort -nr | head
- 权限与磁盘:ls -l /var/log/myapp/;df -h;du -sh /var/log/(确认进程对日志目录有写权限且磁盘空间充足)