Ubuntu 上 Node.js 日志分析实用技巧
一 日志采集与规范化
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
logger.info({ event: 'server_start', port: 3000, requestId: 'abc-123' });
以上做法便于后续在 ELK/Graylog/Loki 中解析与可视化。二 本地快速定位与统计
tail -f /path/to/app.logpm2 logs <app>,或 pm2 logs --lines 1000 | grep ERROR 快速筛错sudo journalctl -u <service> -f 或 sudo tail -f /var/log/sysloggrep -c "ERROR" combined.logawk '/2025-04-01 10:00:00/,/2025-04-01 11:00:00/' combined.logawk '{print $1}' access.log | sort | uniq -c | sort -nr | headawk '/Memory Usage:/ {print $3}' app.log | sort -nr | head -n 10awk '{print $NF}' access.log | sort -nr | head.catch() 或 try/catch,并监听 process.on('unhandledRejection')emitter.setMaxListeners() 或 removeListenernode --max-old-space-size=4096 app.js 并配合性能分析工具定位根因三 集中化与可视化分析
input { file { path => "/var/log/nodejs/*.log" start_position => "beginning" } }
filter {
json { source => "message" }
# 若非 JSON,可用 GROK:
# grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:msg}" } }
}
output { elasticsearch { hosts => ["localhost:9200"] index => "nodejs-%{+YYYY.MM.dd}" } }
四 性能与内存问题的日志驱动排查
strace -p <pid> -T -e trace=network,open,read,write(定位文件/网络瓶颈)node --inspect-brk app.js,配合 Chrome DevTools 或 VS Code 断点排查node --prof 生成 v8.log,再用 npm i -g tick-processor 分析热点函数五 运维与稳定性实践
/etc/logrotate.d/nodejs:/var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
pm2 logs 集中查看多实例输出,配合 pm2 monit 观察 CPU/内存。