1. 使用系统原生命令实时查看日志
Ubuntu系统自带的基础命令可快速监控Node.js日志文件(如app.log)的实时更新:
tail -f:实时显示日志文件末尾新增内容,是最常用的实时查看工具。例如tail -f /var/log/nodejs/app.log,按Ctrl+C退出。less + 跟踪:用less app.log打开日志文件,输入Shift+F进入跟踪模式,实时查看新增内容;按Ctrl+C退出跟踪,q退出less。grep过滤:结合grep筛选特定关键词(如错误信息),例如tail -f app.log | grep "ERROR",仅显示包含“ERROR”的日志行。2. 利用PM2进程管理器监控
PM2是Node.js应用的生产级进程管理工具,内置强大的日志管理功能:
npm install pm2 -g
pm2 start app.js --name "my-node-app" --log /var/log/nodejs/app.log
pm2 logs命令查看所有应用的实时日志;若需查看特定应用,用pm2 logs my-node-app;添加--lines 100可显示最近100行日志。pm2 install pm2-logrotate安装日志轮换插件,避免日志文件过大,自动切割并压缩旧日志。3. 采用Winston/Bunyan等日志库增强记录
Winston和Bunyan是Node.js生态中流行的日志库,提供灵活的日志级别、多传输方式和结构化日志:
winston及winston-daily-rotate-file(日志每日轮换),配置文件输出、控制台输出和错误日志分离:const winston = require('winston');
const { DailyRotateFile } = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console({ format: winston.format.simple() }), // 控制台输出
new DailyRotateFile({
filename: '/var/log/nodejs/app-%DATE%.log', // 按日期分割日志文件
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
}),
new DailyRotateFile({
filename: '/var/log/nodejs/error-%DATE%.log',
datePattern: 'YYYY-MM-DD',
level: 'error', // 仅记录错误日志
maxSize: '20m',
maxFiles: '30d'
})
]
});
logger.info('Application started on port 3000');
logger.error('Database connection failed');
4. 部署ELK Stack集中式日志管理
ELK(Elasticsearch+Logstash+Kibana)是开源的集中式日志管理方案,适合大规模应用:
sudo apt install elasticsearch kibana,启动服务并配置访问权限。winston-logstash库,示例代码:const winston = require('winston');
const LogstashTransport = require('winston-logstash').Logstash;
const logger = winston.createLogger({
transports: [
new LogstashTransport({
host: 'localhost',
port: 5044,
node_name: 'nodejs-app'
})
]
});
logstash-*),通过Dashboard可视化日志指标(如请求次数、错误率)。5. 结合Prometheus+Grafana监控指标
若需监控应用性能指标(如请求延迟、内存使用),可使用Prometheus收集指标,Grafana可视化:
npm install prom-client,在Node.js应用中定义指标(如HTTP请求计数、延迟直方图):const promClient = require('prom-client');
const httpRequestDuration = new promClient.Histogram({
name: 'http_request_duration_seconds',
help: 'Duration of HTTP requests in seconds',
labelNames: ['method', 'route'],
buckets: [0.1, 0.5, 1, 2, 5] // 定义延迟桶
});
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
httpRequestDuration.observe(
{ method: req.method, route: req.route ? req.route.path : req.path },
(Date.now() - start) / 1000
);
});
next();
});
// 暴露/metrics端点,供Prometheus抓取
app.get('/metrics', async (req, res) => {
res.set('Content-Type', promClient.register.contentType);
res.end(await promClient.register.metrics());
});
prometheus.yml添加Node.js应用的/metrics端点作为抓取目标。6. 使用Log.io实时日志流
Log.io是基于Web的实时日志监控工具,支持多服务器日志集中查看:
npm install -g log.io-server log.io-file-input。log.io-server/config.js,添加Node.js日志文件路径(如/var/log/nodejs/app.log)。logio-server(服务器),logio-file-input(文件监控),通过浏览器访问http://server-ip:6688查看实时日志流。