在Debian系统上排查Node.js应用故障,日志往往是最直接的切入点。但前提是——你得知道怎么用、怎么配、怎么看。很多开发者习惯遇到问题就翻代码、调试,其实日志才是沉默的见证者,关键信息早就写在那里了。下面这套路数,基本覆盖了从应用层到系统层的常见排查场景,值得按图索骥走一遍。

1. 配置结构化日志记录
先说说第一件事:告别console.log,用正经的日志库来干活。Winston、Bunyan 这类工具天然支持结构化输出,也就是JSON格式,后续用 grep、jq 一类的工具过滤解析非常方便。
配置的时候,重点在于把日志级别和运行环境挂钩。比如:
- 开发环境:开 DEBUG,所有流程细节都记录下来,方便调试;
- 生产环境:切到 INFO 或 WARN,避免日志量过大,拖慢性能。
用Winston举个例:
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' }),
process.env.NODE_ENV !== 'production'
? new winston.transports.Console({ format: winston.format.simple() })
: null
].filter(Boolean)
});
logger.info('Application started', { port: 3000 });
这样一来,错误堆栈、请求参数、时间戳都清晰可查,排查效率直接上一个台阶。
2. 利用PM2管理进程与日志
PM2 几乎是生产环境Node.js的标配,除了进程管理,它自带的日志聚合功能其实很实用。安装后几行命令就能搞定日常工作:
- 启动并命名应用:
pm2 start app.js --name "my-node-app" - 实时查看所有日志:
pm2 logs - 只看某个应用的日志:
pm2 logs my-node-app - 导出日志到文件:
pm2 logs > app-logs.txt - 清空日志:
pm2 flush
PM2 默认保留7天日志历史,基本不用担心日志丢失的问题。
3. 查看系统级日志
再说系统日志,这层往往容易被忽略,但很多应用层问题其实根子在系统层。Debian 用 systemd-journald 管理日志,通过 journalctl 就能调出大量有用信息:
- 实时跟踪某个服务的日志:
sudo journalctl -u your-nodejs-service -f - 指定时间范围:
sudo journalctl --since "2025-09-29 10:00:00" --until "2025-09-29 11:00:00" - 过滤错误关键词:
sudo journalctl -u your-nodejs-service | grep -i "error|fail"
尤其是当应用出现内存溢出、数据库连接异常这类问题,系统日志往往是第一手线索。
4. 实时监控与过滤日志
命令行工具组合起来,效率非常高。几个常用操作:
- 实时跟踪日志末尾:
tail -f logs/combined.log - 快速过滤错误:
grep "ERROR" /path/to/your/app.log - 系统层面搜超时:
grep -i "timeout" /var/log/syslog - 大文件分页查看:
less /path/to/your/app.log(按F实时滚动,q退出)
举个例子,线上出现TypeError,一句话就能定位到具体代码位置,省去大量翻日志的时间。
5. 日志轮转管理
磁盘空间是个容易被忽略的坑。日志轮转能帮你避免“日志把磁盘撑爆”的尴尬。Debian 上用 logrotate 就能搞定,创建一个配置文件 /etc/logrotate.d/your-nodejs-app,内容如下:
/path/to/your/nodejs-app/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
配置完成后,先调试一下:sudo logrotate -d /etc/logrotate.d/your-nodejs-app,没问题再强制运行:sudo logrotate -f /etc/logrotate.d/your-nodejs-app。每天轮转、保留7天、自动压缩,基本够用。
6. 集成集中式日志管理系统
最后,如果规模上去了,生产环境强烈建议上集中式日志系统。ELK Stack(Elasticsearch + Logstash + Kibana)和 Graylog 是主流选择:
- ELK:Elasticsearch 存储,Logstash 解析,Kibana 可视化;
- Graylog:支持告警、仪表盘,扩展性也不错。
集成之后,像 "userId": 123 这样的关键词检索,跨服务的故障链路一眼就能看清。
7. 结合系统工具深度排查
如果日志里找不出明确问题,那就要和系统工具配合使用了:
- 资源占用:
top(CPU/内存实时)、free -m(内存剩余)、df -h(磁盘空间); - 网络连接:
netstat -tulnp(端口监听)、ss -s(连接统计); - 进程状态:
ps aux | grep node(Node.js进程的资源占用)。
这套组合拳打下来,问题到底是应用层的内存泄漏,还是系统层的磁盘空间不足,基本就能判断个八九不离十了。