Node.js日志自动化处理脚本实战指南
自动化处理Node js日志可通过pm2实现进程管理与日志轮转,结合winston进行细粒度控制,利用Shell或Node脚本分析日志,引入ELK或Fluentd实现集中式管理,并通过环境变量灵活配置。这些方法覆盖单机到分布式场景,提升排错与监控效率。
要使用脚本自动化处理 Node.js 应用程序的日志,方法其实不止一种。下面梳理几种常用的实践路径,从进程管理到日志库集成,再到集中式分析,帮你一步步搞定日志的收集、分析和维护。

1. 使用 pm2 进行进程管理和日志监控
pm2 在 Node.js 生态里几乎是标配的进程管理工具,日志这块它也包揽了。通过简单配置,就能实现日志的自动生成、轮转和实时查看。
安装 pm2
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 启动就行。
查看和管理日志
- 实时日志:
pm2 logs my-app - 查看文件日志:
tail -f ./logs/out.log或tail -f ./logs/err.log - 日志轮转由 pm2 自动完成,手动清理可以执行
pm2 clear my-app
2. 使用 winston 和 pm2 结合进行高级日志管理
winston 是 Node.js 里最成熟的日志库之一,它允许你灵活配置多种传输方式(文件、控制台、远程服务等)和日志格式。和 pm2 配合,能应对更复杂的场景。
安装 winston
npm install winston
配置 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 使用
仍然用 pm2 启动应用,winston 会按照自己的配置把日志写入文件,互不冲突。
3. 自动化日志分析
日志落盘之后,定期用脚本分析一下,能提取出很多有价值的信息。工具可以选 grep、awk,也可以自己写 Node.js 脚本。
示例:Shell 脚本统计错误日志数量
#!/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"
赋予执行权限后运行即可。
示例:Node.js 脚本生成日志报告
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}`);
});
4. 使用集中式日志管理系统
当应用规模变大,或者分布式部署时,单机的日志管理就不够用了。这时推荐 ELK(Elasticsearch, Logstash, Kibana)、Graylog 或 Fluentd 这类集中式方案。它们能跨节点收集、存储和分析日志。
示例:用 Fluentd 收集 Node.js 日志
-
安装 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等插件),将日志打上标签发送出去。
5. 使用环境变量和配置文件管理日志设置
为了让日志配置更灵活,可以用环境变量或配置文件来控制日志级别、输出路径等。这样开发、测试、生产环境可以各用各的设置,不用改代码。
示例:用环境变量配置 winston
修改 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 的集中式分析,关键在于根据你的应用规模和运维需求来选。没有银弹,但上面这些方法基本能覆盖从单机到分布式的大多数场景。把日志管好,排错和监控的效率能提升一大截。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
iOS开发中layoutSubviews的常见问题与解决方案详解
`layoutSubviews`是系统在视图尺寸变化时触发的布局回调。常见问题包括布局循环导致的性能损耗,以及自动布局与手动设置frame的冲突。解决方案是确立清晰的更新模式:使用自动布局时更新约束而非直接设置frame;手动布局时集中计算并确保幂等性。优化上需减少方法内计算量,善用调试工具,并确保线程安全。
iOS开发中layoutSubviews方法的原理与使用详解
`layoutSubviews`是iOS中由系统自动调用、用于重新计算和设置子视图位置尺寸的核心方法。开发者可通过`setNeedsLayout`或`layoutIfNeeded`触发它。重写该方法可实现自定义布局,但需注意性能优化,避免昂贵操作。在现代开发中,它虽常被AutoLayout替代,但在混合布局、定制动画及底层组件开发中仍不可或缺。
Ubuntu JSP内存泄漏问题排查与解决
在Ubuntu环境中,通过调整JVM堆内存参数、开启GC日志与堆转储,借助MAT等工具定位泄漏根源,优化代码(及时关闭资源、避免静态集合滥用、正确使用ThreadLocal),并监控内存使用(jstat、VisualVM),可有效解决JSP应用内存泄漏问题。
Jetpack使用常见问题与解决方法全攻略
Jetpack依赖冲突可通过统一版本定义与Gradle策略解决。组件初始化需遵循生命周期感知,避免耗时操作。Room数据库迁移应预先规划并实现完整迁移方案。导航组件需规范ID管理并注意返回栈逻辑。视图绑定与DataBinding需确保配置正确并检查表达式。
MPP入门到进阶基础知识完整指南
MPP架构将计算任务分解到多个节点并行处理,核心包含协调节点与计算节点,数据分片存储以实现计算向数据靠拢。它具备高扩展性与高性能,常借助列式存储和向量化引擎优化查询,适用于复杂分析场景。选型需考虑数据分布与资源隔离,学习建议从理解原理入手,再实践操作与性能调优。
- 热门数据榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-07-19 06:16
2026-07-19 06:16
2026-07-19 06:16
2026-07-19 06:16
2026-07-19 06:15
2026-07-19 06:15
2026-07-19 06:15
2026-07-19 06:15
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

