如何监控Node.js应用的日志异常
Node.js日志异常监控方案:用console区分错误日志,采用Winston或Pino实现结构化输出,集成ELK集中管理,结合PM2或Prometheus+Grafana实时监控与可视化,形成排查预警闭环。
说到 Node.js 应用的稳定性,日志监控是绕不开的硬功夫。生产环境里,异常日志就是你的“黑匣子”——哪段代码出了问题、什么时候出的、影响范围多大,全都靠它来还原。下面梳理了几种主流方案,从基础的内置模块到企业级的监控平台,基本覆盖了不同规模项目的需求。

1. 使用内置的console模块
最直接的办法,Node.js 自带的 console 模块就能干活。关键是用对方法——console.error 专门处理错误信息,跟普通日志区分开,后续检索起来会省很多事。
try {
// 你的代码
} catch (error) {
console.error('Error:', error);
}
不过,一旦项目复杂起来,单靠 console 就容易失控:日志格式不统一、文件管理靠手动、查起来像大海捞针。这时候就需要专业的日志库上场了。
2. 使用日志库
社区里有两个高频选项:Winston 和 Pino。前者功能全面,开箱即用,适合大多数场景;后者极致追求性能,尤其适合高并发应用。怎么选?看你的吞吐量要求:如果不差那点 CPU,Winston 的丰富生态能省很多弯路;如果对延迟敏感,Pino 几乎是唯一选择。
Winston
Winston 支持多种传输方式(文件、控制台、HTTP 等),一个典型配置长这样:
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' }),
new winston.transports.Console({ format: winston.format.simple() })
]
});
try {
// 你的代码
} catch (error) {
logger.error('Error:', error);
}
Pino
Pino 的用法更简洁,输出 JSON 格式,解析效率极高:
const pino = require('pino');
const logger = pino();
try {
// 你的代码
} catch (error) {
logger.error(error);
}
3. 集成日志管理平台
日志写到本地文件只是第一步。真正要做的是集中管理、快速检索、可视化分析。目前最成熟的方案是 ELK Stack(Elasticsearch + Logstash + Kibana),也可以通过 Logstash 的 TCP 端口把 Node.js 日志直接送进去:
logstash:5000
不过注意,上面这个配置示例其实是 Ja va 的 logback 写法——如果你在 Node.js 里走 HTTP 或 UDP 协议,可以用 winston 的 winston-logstash 插件,或者直接用 @elastic/elasticsearch 发送到 Elasticsearch。另外,Graylog、Papertrail 也都是轻量替代,适合不想折腾自建堆栈的团队。
4. 使用监控工具
日志是事后排查,监控是实时发现。两者搭配才能形成闭环。
PM2
PM2 作为进程管理器,天然带有日志查看和监控面板。几个常用命令:
pm2 start app.js --name my-app
pm2 logs my-app
pm2 monit
缺点也很明显:PM2 的日志是流式的,不好做历史分析和告警。遇上复杂场景,就得升级到 Prometheus + Grafana 组合。
Prometheus + Grafana
通过 prom-client 暴露 Node.js 应用的指标(比如请求耗时、错误率),Prometheus 定期抓取,Grafana 负责可视化。一个典型的 HTTP 请求耗时监控代码:
const promClient = require('prom-client');
const express = require('express');
const app = express();
const httpRequestDurationMicroseconds = new promClient.Histogram({
name: 'http_request_duration_ms',
help: 'Duration of HTTP requests in ms',
labelNames: ['method', 'route', 'code'],
buckets: [0.10, 5, 15, 50, 100, 200, 300, 400, 500]
});
app.use((req, res, next) => {
res.locals.startEpoch = Date.now();
res.on('finish', () => {
const responseTimeInMs = Date.now() - res.locals.startEpoch;
httpRequestDurationMicroseconds.labels(req.method, req.route.path, res.statusCode).observe(responseTimeInMs);
});
next();
});
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
promClient.collectDefaultMetrics();
app.listen(3000);
});
之后在 Prometheus 里配置抓取目标,再到 Grafana 里搭个仪表盘——请求速率、慢请求分布、错误状态码一目了然。这套组合拳打下来,线上异常基本无处遁形。
总之一句话:日志不是写了就完事,关键在“监控”二字。选对工具、搭好管道,你才有底气告诉团队:“这个异常,我能马上定位。”
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















