若Node.js应用在前台运行(如通过node app.js启动),错误信息会直接打印到终端,通常以**Error:为前缀,或包含HTTP状态码**(如404、500)。若需长期保存日志,可将输出重定向到文件:
node app.js > app.log 2>&1
其中>将标准输出重定向到app.log,2>&1将标准错误输出合并到标准输出,实现错误日志的集中存储。
对于已保存的日志文件(如app.log),可通过以下命令快速查找错误信息:
grep筛选错误关键字:grep 'Error' app.log # 查找包含"Error"的行
grep -i 'error' app.log # 忽略大小写查找
grep -E '4[0-9]{2}|5[0-9]{2}' app.log # 查找4xx(客户端错误)或5xx(服务器错误)
tail -f app.log # 实时显示日志文件末尾内容,按Ctrl+C退出
这些命令可结合使用,例如tail -f app.log | grep 'Error'可实时监控并筛选错误信息。
若Node.js应用以系统服务(如systemd)运行,可使用journalctl命令查看关联日志:
sudo journalctl -u your-node-service.service # 替换为你的服务名称
例如,若服务名称为node-app.service,则命令为sudo journalctl -u node-app.service。该命令会显示服务的所有日志,包括错误信息。
为更高效地管理错误日志,推荐使用第三方日志库(如Winston),将错误日志单独保存到指定文件:
npm install winston
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.error('This is an error message', { stack: new Error().stack });
配置后,错误日志会单独保存到error.log文件,便于快速定位问题。
日志中的错误代码(如EADDRINUSE、ENOENT)是解决问题的关键线索,常见错误码及含义如下:
EADDRINUSE:端口已被占用(如Error: listen EADDRINUSE :::3000),解决方法:终止占用端口的进程(lsof -i :3000查看进程ID,kill -9 <PID>终止)。ENOENT:文件或目录不存在(如Error: ENOENT: no such file or directory, open '/path/to/file'),解决方法:检查文件路径是否正确。EACCES:权限不足(如Error: EACCES: permission denied, open '/var/log/node.log'),解决方法:修改文件/目录权限(chmod 644 /var/log/node.log)。ECONNREFUSED:连接被拒绝(如Error: connect ECONNREFUSED 127.0.0.1:8080),解决方法:检查目标服务是否启动、防火墙设置或URL是否正确。ETIMEDOUT:操作超时(如Error: connect ETIMEDOUT 192.168.1.1:80),解决方法:检查网络连接、增加超时时间(如axios的timeout配置)。通过以上方法,可快速定位并解决Node.js应用中的错误。若需更高级的日志分析(如可视化),可结合ELK Stack、Graylog等工具,但基础排查可通过命令行和日志库完成。