NodeJS读取分析Nginx错误日志的方法

2020-06-17 07:04:38易采站长站整理

网上很少看到有用NodeJS运维系列文章,后续我会更新一些NodeJS运维相关的内容又或者说让我们更加的深入了解一些服务器的知识以及自动化运维方面的基础知识 为什么要做错误日志分析,因为网上这方面的工具不多我找到一个goaccess但是都是分析成功日志以及用户访问趋势,找了半天没找着自己想要的索性就自己利用Node造一个

错误日志分析

首先我们要读取Nginx日志,我们可以看到Nginx的错误日志格式一般都是这样子,需要注意的是Nginx的错误日志格式是差不多的因为无法设置日志格式只能设置日志错误等级所以我们分析的时候很方便

 这里我们用到readline

逐行读取,简单来说可以做

文件逐行读取:比如说进行日志分析。
自动完成:比如输入npm,自动提示”help init install”。
命令行工具:比如npm init这种问答式的脚手架工具。 这里我们主要做日志分析其他的感兴趣可以琢磨一下

实现方法


const readline = require('readline');
const fs = require('fs');
const path = require('path');
console.time('readline-time')
const rl = readline.createInterface({
input: fs.createReadStream(path.join(__dirname, '../public/api.err.log'), {
start: 0,
end: Infinity
}),

});
let count = 0;
rl.on('line', (line) => {
const arr = line.split(', ');
const time = arr[0].split('*')[0].split('[')[0].replace(///g, '-');//获取到时间
const error = arr[0].split('*')[1].split(/ds/)[1];//错误原因
const client = arr[1].split(' ')[1];//请求的客户端
const server = arr[2].split(' ')[1];//请求的网址
const url = arr[3].match(/s/(S*)s/)[0].trim()//获取请求链接
const upstream = arr[4].match(/(?<=").*?(?=")/g)[0];//获取上游
const host = arr[5].match(/(?<=").*?(?=")/g)[0];//获取host
const referrer = arr[6] ? arr[6].match(/(?<=").*?(?=")/g)[0] : '';//来源
console.log(`时间:${time}-原因:${error}-客户端:${client}-网址:${server}-地址:${url}-上游:${upstream}-主机:${host}-来源:${referrer}`);
count++;
});
rl.on('close', () => {
let size = fs.statSync(path.join(__dirname, '../public/api.err.log')).size;
console.log(`读取完毕:${count};文件位置:${size % 2 === 0}`);
console.timeEnd('readline-time')
});

上面代码有几点需要注意的是会创建一个文件可读流然后由于演示所以我是直接找的本地地址如果是生产环境的话大家可以直接填写服务器上的错误日志地址,如果没有Nginx错误日志分割的话每天会产生很多日志,createReadStream读取几十M的文件还好如果读取几百M或者上G的容量日志这会造成性能问题,所以我们需要在每次createReadStream没必要每次从0字节开始读取,ceateReadStream提供了start和end