自动化处理Node.js日志可通过pm2实现进程管理与日志轮转,结合winston进行细粒度控制,利用Shell或Node脚本分析日志,引入ELK或Fluentd实现集中式管理,并通过环境变量灵活配置。这些方法覆盖单机到分布式场景,提升排错与监控效率。
通过脚本自动化处理Node.js应用日志,有多种方法可供选择。以下梳理了几种常见实践路径,涵盖进程管理、日志库集成及集中式分析,帮助实现日志的收集、分析和管理。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
pm2 是Node.js生态中常用的进程管理工具,同时也提供日志管理功能。通过简单配置,即可实现日志的自动生成、轮转和实时查看。
npm install pm2 -g
pm2 start app.js --name my-app
pm2 默认已处理日志轮转,如需更精细的控制,可使用 ecosystem.config.js 文件:
module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
instances: 'max',
exec_mode: 'cluster',
log_date_format: 'YYYY-MM-DD HH:mm Z',
out_file: './logs/out.log',
error_file: './logs/err.log',
merge_logs: true,
log_level: 'info',
time: true,
}],
};
然后使用 pm2 start ecosystem.config.js 启动。
winston 是Node.js中成熟的日志库之一,支持灵活配置多种传输方式(文件、控制台、远程服务等)和日志格式。与 pm2 配合,可应对更复杂的场景。
npm install winston
创建 logger.js 文件:
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.printf(({ timestamp, level, message }) => `${timestamp} [${level.toUpperCase()}]: ${message}`)
),
transports: [
new transports.File({ filename: 'logs/error.log', level: 'error' }),
new transports.File({ filename: 'logs/combined.log' }),
],
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new transports.Console({
format: format.combine(format.colorize(), format.simple()),
}));
}
module.exports = logger;
在应用内直接引用:
const logger = require('./logger');
logger.info('应用启动成功');
logger.error('发生错误');
仍使用 pm2 启动应用,winston 会按自身配置将日志写入文件,互不冲突。
日志落盘后,定期用脚本分析可提取有价值信息。工具可选 grep、awk,或自行编写Node.js脚本。
#!/bin/bash
ERROR_COUNT=$(grep -i "error" logs/err.log | wc -l)
INFO_COUNT=$(grep -i "info" logs/combined.log | wc -l)
echo "错误日志数量: $ERROR_COUNT"
echo "信息日志数量: $INFO_COUNT"
赋予执行权限后运行即可。
const fs = require('fs');
const path = require('path');
const errorLogPath = path.join(__dirname, 'logs', 'err.log');
const combinedLogPath = path.join(__dirname, 'logs', 'combined.log');
fs.readFile(errorLogPath, 'utf8', (err, data) => {
if (err) throw err;
const errorCount = data.split('\n').filter(line => line.includes('error')).length;
console.log(`错误日志数量: ${errorCount}`);
});
fs.readFile(combinedLogPath, 'utf8', (err, data) => {
if (err) throw err;
const infoCount = data.split('\n').filter(line => line.includes('info')).length;
console.log(`信息日志数量: ${infoCount}`);
});
当应用规模扩大或分布式部署时,单机日志管理可能不足。此时推荐ELK(Elasticsearch, Logstash, Kibana)、Graylog或Fluentd等集中式方案,可跨节点收集、存储和分析日志。
安装 Fluentd:
sudo apt-get update
sudo apt-get install fluentd
配置 Fluentd:编辑 /etc/td-agent/td-agent.conf,添加输入(tail方式读取日志文件)和输出(转发到Elasticsearch):
@type tail
path /path/to/your/node/logs/*.log
pos_file /var/log/td-agent/nodejs.log.pos
tag nodejs.*
@type none
@type elasticsearch
host localhost
port 9200
logstash_format true
flush_interval 10s
重启 Fluentd:sudo systemctl restart td-agent
在Node.js中给winston添加Fluentd传输(需安装winston-fluent等插件),将日志打上标签发送出去。
为提升日志配置的灵活性,可使用环境变量或配置文件控制日志级别、输出路径等。这样开发、测试、生产环境可各自设置,无需修改代码。
修改 logger.js,从环境变量读取:
const { createLogger, format, transports } = require('winston');
const logLevel = process.env.LOG_LEVEL || 'info';
const logFile = process.env.LOG_FILE || 'combined.log';
const logger = createLogger({
level: logLevel,
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.printf(({ timestamp, level, message }) => `${timestamp} [${level.toUpperCase()}]: ${message}`)
),
transports: [
new transports.File({ filename: logFile }),
],
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new transports.Console({
format: format.combine(format.colorize(), format.simple()),
}));
}
module.exports = logger;
启动时:
LOG_LEVEL=debug LOG_FILE=./logs/debug.log node app.js
自动化处理Node.js日志的路径有多种——从pm2的轻量管理,到winston的细粒度控制,再到ELK或Fluentd的集中式分析。关键在于根据应用规模和运维需求选择合适方案。以上方法基本覆盖从单机到分布式的大多数场景。管理好日志,可显著提升排错和监控效率。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述