Node.js日志在Ubuntu上的故障排查指南
首先需明确Node.js日志的存储路径,避免因路径错误导致排查方向偏差。常见场景包括:
node app.js > app.log 2>&1重定向,日志会保存在当前目录的app.log中。~/.pm2/logs/目录,文件名格式为<app_name>-err.log(错误日志)和<app_name>-out.log(输出日志)。journald捕获,可通过/var/log/syslog或/var/log/messages查看(部分系统可能需通过journalctl访问)。winston、log4js)或环境变量(如LOG_PATH=/var/log/myapp.log)指定了路径,需检查对应目录。若日志文件无法写入,需确认Node.js进程对目标目录/文件有足够权限:
ls -l /path/to/logfile.log(需替换为实际路径)。node用户运行):sudo chown node:node /path/to/logfile.log。sudo chmod 644 /path/to/logfile.log(或755针对目录)。sudo mkdir -p /var/log/myapp && sudo chown node:node /var/log/myapp。若使用winston、morgan等日志库,需检查配置是否正确:
error级别仅记录错误,info记录常规信息)。例如,winston配置中level: 'info'会记录info及以上级别日志,level: 'error'仅记录错误。transports是否指向正确路径(如new winston.transports.File({ filename: '/var/log/myapp.log' })),并确认路径存在且可写。LOG_LEVEL)设置级别,需确保启动应用时正确传递(如LOG_LEVEL=debug node app.js)。若使用pm2、systemd等工具管理Node.js进程,需检查工具本身是否正常:
pm2 logs无法查看日志,尝试重启PM2(pm2 restart all)或重新加载配置(pm2 reload all)。若进程未启动,使用pm2 start app.js启动并检查状态(pm2 status)。systemctl管理,检查服务状态(sudo systemctl status my-nodejs-app),查看是否有启动错误。日志可通过journalctl -u my-nodejs-app -f实时查看(-f表示跟随最新日志)。获取日志文件后,通过以下方式快速定位问题:
grep命令提取错误信息(如grep 'ERROR' /var/log/myapp.log或grep -i 'error' ~/.pm2/logs/myapp-err.log)。morgan中间件,可通过access.log查看请求状态码(如grep '404' access.log查找未找到资源,grep '500' access.log查找服务器错误)。Error: Cannot find module 'express')能直接指向问题根源(如缺失依赖)。确保环境配置正确,避免因依赖或环境问题导致日志异常:
npm install或yarn install安装所有依赖,避免因缺失模块导致日志记录失败。node -v检查版本,过旧版本可能存在日志库兼容性问题,建议升级到最新的LTS版本(如18.x)。NODE_ENV=production、DATABASE_URL)已正确设置(可通过echo $VARIABLE_NAME查看)。当日志文件过大时,需配置日志轮转以避免磁盘空间耗尽:
winston-daily-rotate-file:安装库(npm install winston-daily-rotate-file),配置每日轮转(如new winston.transports.DailyRotateFile({ filename: '/var/log/myapp-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '14d' }))。logrotate工具:创建/etc/logrotate.d/myapp配置文件,内容如下:/var/log/myapp.log {
daily
rotate 14
compress
missingok
notifempty
create 644 node node
}
该配置表示每日轮转,保留14天压缩日志,创建新日志时设置权限为644、所有者为node。