如何在Ubuntu中利用Node.js日志进行故障排查
Node.js应用的日志通常存储在以下位置,需根据项目配置确认:
logs文件夹(如logs/app.log、logs/error.log);config.json、settings.js),查看transports(Winston)或appenders(Log4js)中的filename字段;node app.js > app.log 2>&1 &,日志会保存在当前目录的app.log中。若通过pm2管理Node.js应用(生产环境常用),可通过以下命令实时查看日志:
pm2 logs # 查看所有应用的实时日志
pm2 logs <app_name> # 查看指定应用的实时日志
pm2 logs --lines 1000 # 显示最近1000行日志(避免日志过长)
pm2 logs --follow # 持续跟踪新日志(类似tail -f)
pm2会自动收集应用的标准输出(stdout)和错误输出(stderr),无需手动重定向,适合长期运行的服务。
若应用日志未捕获到关键错误(如进程崩溃),可查看Ubuntu系统日志,获取更多上下文:
sudo tail -f /var/log/syslog # 实时查看系统日志(包含Node.js进程的启动/停止信息)
your-node-service.service),使用以下命令查看服务相关日志:sudo journalctl -u your-node-service.service -f # 实时查看指定服务的日志
sudo journalctl -u your-node-service.service --since "2025-11-06 10:00:00" # 按时间筛选日志
替换your-node-service.service为实际服务名称(可通过systemctl list-units --type=service查看)。使用Winston、Log4js等日志库时,可通过日志级别和结构化格式快速定位问题:
debug,生产环境用error),例如Winston配置:const winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info', // 通过环境变量动态设置
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json() // 结构化日志(便于后续分析)
),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }), // 错误日志单独存储
new winston.transports.File({ filename: 'combined.log' }), // 所有日志合并
new winston.transports.Console() // 控制台输出(开发环境方便调试)
]
});
grep筛选错误日志:grep '"level": "error"' combined.log;morgan记录):grep ' 4[0-9]{2} ' access.log(4xx错误)、grep ' 5[0-9]{2} ' access.log(5xx错误)。若日志无法定位问题(如内存泄漏、异步逻辑错误),可使用以下工具:
--inspect-brk参数,然后在Chrome浏览器访问chrome://inspect,连接至调试端口,设置断点逐步排查:node --inspect-brk app.js
clinic.js(Node.js官方工具集)分析CPU、内存占用,生成火焰图定位性能瓶颈:npx clinic doctor -- node app.js # 分析整体性能
npx clinic bubbleprof -- node app.js # 生成火焰图
生产环境中,日志文件会不断增长,需通过日志轮转限制文件大小和数量:
winston-daily-rotate-file插件,每天生成一个新日志文件:const winston = require('winston');
require('winston-daily-rotate-file');
const transport = new winston.transports.DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m', // 单个文件最大20MB
maxFiles: '30d' // 保留30天日志
});
const logger = winston.createLogger({
transports: [transport]
});
logrotate配置日志轮转(适用于非Winston日志),编辑/etc/logrotate.d/nodejs文件:/path/to/your/app.log {
daily
rotate 30
compress
missingok
notifempty
copytruncate # 避免重启应用
}
该配置表示每天轮转日志,保留30天,压缩旧日志,且不重启应用。通过以上步骤,可系统性地利用Node.js日志排查Ubuntu中的应用故障,从实时监控到深度分析,覆盖常见问题的解决路径。