最近有在做日志文件的分析,其中有一个需求:A服务器项目需要用Nodejs监听日志文件的变化,当项目产生了新的日志信息,将新的部分通过socket传输到B服务器项目。socket暂时不做分析。
这个需求很简单,通过分析我们开始撸码吧。 在撸码的过程中还能巩固所学Nodejs的API,何乐而不为呢?
所用的API
fs.watchFile()
语法
fs.watchFile(filename[, options], listener)
参数解析
监视 filename 的更改。 每当访问文件时都会调用 listener 回调。
listener 有两个参数,当前的 stat 对象和之前的 stat 对象
这些 stat 对象是 fs.Stat 的实例。
要在修改文件(而不仅仅是访问)时收到通知,则需要比较 curr.mtime 和 prev.mtime。
当 fs.watchFile 操作导致 ENOENT 错误时,它将调用一次监听器,并将所有字段置零(或将日期设为 Unix 纪元)。 如果文件是在那之后创建的,则监听器会被再次调用,且带上最新的 stat 对象。 这是 v0.10 之后的功能变化。
使用 fs.watch() 比 fs.watchFile
和 fs.unwatchFile
更高效。 应尽可能使用 fs.watch 代替 fs.watchFile 和 fs.unwatchFile。
当 fs.watchFile() 正在监视的文件消失并重新出现时,第二次回调事件(文件重新出现)返回的 previousStat 会与第一次回调事件(文件消失)返回的 previousStat 相同。
这种情况发生在:
例子
fs.open()
语法
fs.open(path[, flags[, mode]], callback)
参数解析
fs.read()
语法
fs.read(fd, buffer, offset, length, position, callback)
参数解析
fs.createReadStream()
语法
fs.createReadStream(path[, options])
参数解析
返回: <fs.ReadStream> 参阅可读流。
如果 autoClose 为 false,则即使出现错误,也不会关闭文件描述符。 应用程序负责关闭它并确保没有文件描述符泄漏。 如果 autoClose 设为 true(默认行为),则在 'error' 或 'end' 事件时将自动关闭文件描述符。
mode 用于设置文件模式(权限和粘滞位),但仅限于创建文件的情况。
例子
读取sample.txt文件的10个字符
fs.createReadStream('sample.txt', { start: 90, end: 99 });
readLine.createInterface
语法
readline.createInterface(options)
参数解析
options <Object>
input <stream.Readable> 要监听的可读流。此选项是必需的。
output <stream.Writable> 将逐行读取数据写入的可写流。
completer <Function> 用于 Tab 自动补全的可选函数。
terminal <boolean> 如果 input 和 output 应该被视为 TTY,并且写入 ANSI/VT100 转义码,则为 true。 默认值: 实例化时在 output 流上检查 isTTY。
historySize <number> 保留的最大历史记录行数。 要禁用历史记录,请将此值设置为 0。 仅当用户或内部 output 检查将 terminal 设置为 true 时,此选项才有意义,否则根本不会初始化历史记录缓存机制。 默认值: 30。
prompt - 要使用的提示字符串。默认值: '> '。
crlfDelay <number> 如果 /r 与 /n 之间的延迟超过 crlfDelay 毫秒,则 /r 和 /n 将被视为单独的行尾输入。 crlfDelay 将被强制转换为不小于 100 的数字。 可以设置为 Infinity, 这种情况下, /r 后跟 /n 将始终被视为单个换行符(对于使用 /r/n 行分隔符的文件读取可能是合理的)。 默认值: 100。
removeHistoryDuplicates <boolean> 如果为 true, 则当添加到历史列表的新输入行与旧的输入行重复时,将从列表中删除旧行。 默认值: false。
escapeCodeTimeout <number> readline 将会等待一个字符的持续时间(当以毫秒为单位读取模糊键序列时,可以使用输入读取到目前为止形成完整的键序列,并且可以采取额外的输入来完成更长的键序列)。 默认值: 500。
文件系统标志
这个不需要司机,记住常见的即可,需要的时候查找。
当 flag 选项采用字符串时,可用以下标志:
'a' - 打开文件用于追加。如果文件不存在,则创建该文件。
'ax' - 与 'a' 相似,但如果路径已存在则失败。
'a+' - 打开文件用于读取和追加。如果文件不存在,则创建该文件。
'ax+' - 与 'a+' 相似,但如果路径已存在则失败。
'as' - 以同步模式打开文件用于追加。如果文件不存在,则创建该文件。
'as+' - 以同步模式打开文件用于读取和追加。如果文件不存在,则创建该文件。
'r' - 打开文件用于读取。如果文件不存在,则出现异常。
'r+' - 打开文件用于读取和写入。如果文件不存在,则出现异常。
'rs+' - 以同步模式打开文件用于读取和写入。指示操作系统绕过本地的文件系统缓存。
这对于在 NFS 挂载上打开文件时非常有用,因为它允许跳过可能过时的本地缓存。 它对 I/O 性能有非常实际的影响,因此除非需要,否则不建议使用此标志。
这不会将 fs.open() 或 fsPromises.open() 转换为同步的阻塞调用。 如果需要同步的操作,则应使用 fs.openSync() 之类的。
'w' - 打开文件用于写入。如果文件不存在则创建文件,如果文件已存在则截断文件。
'wx' - 与 'w' 相似,但如果路径已存在则失败。
'w+' - 打开文件用于读取和写入。如果文件不存在则创建文件,如果文件已存在则截断文件。
'wx+' - 与 'w+' 相似,但如果路径已存在则失败。
fs.Stats 类
fs.Stats 对象提供有关文件的信息。
开始监听日志文件
前提,在app.js中调用watchFile方法,将需要监听的文件路径传入该方法中。
读取新增内容
额外功能:读取历史内容
总结
以上所述是小编给大家介绍的Nodejs监听日志文件的变化的过程解析,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
新闻热点
疑难解答