Node.js readline 模块 完整使用教程
readline 是 Node.js 内置核心模块 ,无需安装,直接 require 即可使用,核心作用:逐行读取流数据(日志文件、命令行输入、大文件读取必备),完美解决大文件一次性加载内存溢出问题。
下面给你最常用、最实用的用法,直接复制就能跑。
一、最核心:逐行读取日志文件(高频用法)
处理日志文件 90% 场景都用这个:
javascript
const fs = require('fs');
const readline = require('readline');
// 1. 创建 readline 实例
const rl = readline.createInterface({
input: fs.createReadStream('app.log'), // 读取文件流
crlfDelay: Infinity // 兼容 Windows/Linux 所有换行符(必加)
});
// 2. 监听每一行数据
rl.on('line', (lineStr) => {
// lineStr 就是日志的每一行,在这里做解析/过滤/处理
console.log('读取到一行:', lineStr);
});
// 3. 文件读取完毕
rl.on('close', () => {
console.log('文件读取完成!');
});
关键事件说明
| 事件名 | 作用 |
|---|---|
line |
每次读取到一行时触发 |
close |
读取完毕/停止时触发 |
error |
发生错误时触发 |
二、进阶用法:命令行交互(输入输出)
readline 也可以做控制台问答工具,比如让用户输入内容:
javascript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin, // 控制台输入
output: process.stdout // 控制台输出
});
// 提问
rl.question('请输入日志文件名:', (answer) => {
console.log('你输入的是:', answer);
// 用完必须关闭
rl.close();
});
三、处理大日志文件(防止内存爆炸)
大文件(1GB以上日志)绝对不能用 readFile ,必须用 readline 流式读取:
javascript
const fs = require('fs');
const readline = require('readline');
let lineCount = 0;
const rl = readline.createInterface({
input: fs.createReadStream('big.log'),
crlfDelay: Infinity
});
rl.on('line', (line) => {
lineCount++;
// 逐行解析日志,比如只看错误日志
if (line.includes('ERROR')) {
console.log('错误日志:', line);
}
});
rl.on('close', () => {
console.log(`总行数:${lineCount}`);
});
四、常用 API 速查(背会这几个就够)
1. 创建实例
javascript
const rl = readline.createInterface(options)
2. 监听行
javascript
rl.on('line', (line) => {})
3. 关闭实例
javascript
rl.close()
4. 暂停/恢复读取
javascript
rl.pause() // 暂停
rl.resume() // 恢复
五、完整实战:解析 Nginx/应用日志
javascript
const fs = require('fs');
const readline = require('readline');
const rl = readline.createInterface({
input: fs.createReadStream('app.log'),
crlfDelay: Infinity
});
// 正则解析日志(示例)
const logReg = /(\d{4}-\d{2}-\d{2}) \[(\w+)\] (.*)/;
rl.on('line', (line) => {
const res = line.match(logReg);
if (res) {
const [, time, level, msg] = res;
console.log({ time, level, msg });
}
});
rl.on('close', () => {
console.log('解析完成');
});
六、重要注意事项(避坑)
- 必须处理
close:读取完成后释放资源 - 大文件必须用流 :
fs.createReadStream+readline是标准方案 crlfDelay: Infinity:兼容所有系统换行符,一定要加- 不要在 line 事件里写同步阻塞代码:会拖慢读取速度
- 错误处理 :生产环境建议加
error事件监听
总结
require('readline') 就记住 3 个核心点:
- 逐行读取 :
on('line')是灵魂 - 搭配文件流 :
fs.createReadStream处理大文件 - 日志解析神器:Node.js 处理日志文件的标准方案
需要我给你写一个可直接用于生产环境的日志解析工具类吗?