在Debian环境下调试Node.js应用前,需先通过结构化日志(如JSON格式)提升日志的可分析性。推荐使用winston
(功能全面)或pino
(高性能)库,避免依赖内置console
模块(难以规模化)。
以winston
为例,基础配置需包含日志级别(开发用debug
,生产用warn
/error
)、传输通道(控制台+文件)及格式化(时间戳+JSON):
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug', // 动态调整级别
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 添加时间戳
winston.format.json() // 结构化输出
),
transports: [
new winston.transports.Console(), // 开发时输出到终端
new winston.transports.File({ filename: 'error.log', level: 'error' }), // 错误日志单独存储
new winston.transports.File({ filename: 'combined.log' }) // 所有日志汇总
]
});
// 示例:记录请求和错误
app.use((req, res, next) => {
logger.info(`Request: ${req.method} ${req.url}`, { userId: req.user?.id }); // 关联用户上下文
next();
});
app.use((err, req, res, next) => {
logger.error(`Unhandled Error: ${err.message}`, { stack: err.stack, url: req.url }); // 记录堆栈跟踪
res.status(500).send('Internal Server Error');
});
通过结构化日志,后续可使用grep
、jq
或日志分析工具快速提取关键字段(如userId
、url
)。
若应用将日志写入文件(如combined.log
、error.log
),使用tail
命令实时监控:
tail -f /path/to/your/app/combined.log # 实时查看所有日志
tail -f /path/to/your/app/error.log # 仅查看错误日志
若需过滤特定内容(如ERROR
级别),结合grep
:
grep "ERROR" /path/to/your/app/combined.log # 提取错误日志
Debian系统日志(syslog
)包含Node.js进程的启动、停止及系统级错误(如端口冲突、权限问题):
sudo tail -f /var/log/syslog | grep node # 过滤Node.js相关日志
若系统使用systemd
管理服务(如通过pm2
或systemctl
启动的Node.js应用),可通过journalctl
查看服务级日志:
sudo journalctl -u your-nodejs-service -f # 替换为你的服务名(如nodeapp.service)
若问题涉及硬件或内核(如内存不足、驱动冲突),使用dmesg
命令:
dmesg | grep node # 过滤Node.js相关内核日志
PM2是Debian下常用的Node.js进程管理器,提供日志集中管理、自动重启等功能。安装后,通过以下命令查看日志:
pm2 logs # 查看所有应用的实时日志
pm2 logs your-app-name # 查看特定应用的日志
pm2 logs --lines 100 # 查看最近100行日志
PM2会自动将日志保存到~/.pm2/logs/
目录(如your-app-name-out.log
、your-app-name-error.log
),支持日志轮转(通过pm2 install pm2-logrotate
开启)。
若日志无法定位问题(如逻辑错误、异步异常),需使用调试工具进行交互式调试。
通过--inspect-brk
标志启动应用,暂停在首行代码处,等待调试器连接:
node --inspect-brk app.js
打开Chrome浏览器,访问chrome://inspect
,点击“为Node打开专用DevTools”,即可设置断点、查看变量、单步执行。
在项目根目录创建.vscode/launch.json
文件,配置调试任务:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug Node.js App",
"program": "${workspaceFolder}/app.js",
"preLaunchTask": "npm: start", // 可选:启动应用的任务
"outFiles": ["${workspaceFolder}/**/*.js"],
"sourceMaps": true // 若使用TypeScript,需开启
}
]
}
按F5
启动调试,即可在VS Code中设置断点、查看调用栈。
使用winston-daily-rotate-file
库自动分割日志文件(按天/小时),避免单个文件过大:
npm install winston-daily-rotate-file
配置示例:
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: 'application-%DATE%.log', // 文件名格式:application-2025-09-23.log
datePattern: 'YYYY-MM-DD', // 按天分割
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天
})
]
});
将日志发送到ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog等平台,实现日志的集中存储、搜索、可视化及报警。例如,使用winston-elasticsearch
库将日志直接发送到Elasticsearch:
npm install winston-elasticsearch
配置示例:
const ElasticsearchTransport = require('winston-elasticsearch');
const logger = winston.createLogger({
transports: [
new ElasticsearchTransport({
level: 'info',
clientOpts: { node: 'http://localhost:9200' } // Elasticsearch地址
})
]
});
通过以上步骤,可充分利用日志快速定位Debian环境下Node.js应用的错误(如语法错误、依赖缺失、端口冲突、数据库连接失败),并通过结构化日志、进程管理工具及集中式日志管理提升调试效率。