当前位置:网站首页>imook nodejs个人学习笔记(日志)

imook nodejs个人学习笔记(日志)

2020-11-10 11:24:37 米姐胡扯扯

总结:使用fs的api读写文件,把日志存在文本中,设置crontab定时拆分日志。

7.1 日志

  • 访问日志access log 系统中 (系统中最重要的日志)
  • 自定义日志 自定义事件 自定义错误等

nodejs的文件操作 nodejs stream

  • 日志的开发和使用
  • 日志的拆分、日志内容分析

写文件是一个异步的,不需要立即去写。用redis太浪费。mysql 是表结构,不适合,也不用部署,也浪费。文件的成本比较低。

7.2 nodejs 文件操作

const fs = require('fs');
const path = require('path');

const fileName = path.resolve(__dirname, 'data.log');

// 读取文件内容
fs.readFile(fileName, (err, data) => {
    if (err) {
        console.log(err);
        return
    }
    // data 是二进制,需要转换成字符串
    console.log(data.toString());
})

// 写入文件
const content = "市民胡女士还是小仙女";
const opt = {
    flag: 'a'
}
fs.writeFile(fileName, content, opt, (err) => {
    if (err) {
        console.log(err);
        return;
    }
})

// 判断文件是不是存在
fs.exists(fileName, (exists) => {
    console.log("exists:", exists);
})

7.3 stream 介绍

性能瓶颈:IO网络IO文件IO
相比于CPU计算和内存读写,IO的主要特点就是
如何在有限的硬件资源下,提高IO的操作效率。

image.png
流的概念:
边看边加载。节省很多的硬件资源。

7.45 读写日志

const fs = require('fs')
const path = require('path')
const readline = require('readline')
// 文件名
const fileName = path.join(__dirname, '../', '../', 'logs', 'access.log');

// readStream 重要
const readStream = fs.createReadStream(fileName)

// 创建readline对象 重要
const rl = readline.createInterface({
    input: readStream
})

let chromeNum = 0
let sum = 0

// 逐行读取
rl.on('line', (lineData) => {
    if (!lineData) {
        return
    }
    // 记录总行数
    sum++

    const arr = lineData.split(' -- ')
    if (arr[2] && arr[2].indexOf('Chrome') > 0) {
        // 累加 chrome 的数量
        chromeNum++
    }
})

// 监听读取完成
rl.on('close', () => {
    console.log('chrome 占比:' + chromeNum / sum)
})

// 写日志
function writeLog(writeStream, log) {
    writeStream.write(log + '\n')  // 关键代码
}

// 生成 write Stream
function createWriteStream(fileName) {
    const fullFileName = path.join(__dirname, '../', '../', 'logs', fileName)
    const writeStream = fs.createWriteStream(fullFileName, {
        flags: 'a'
    })
    return writeStream
}

// 写访问日志
const accessWriteStream = createWriteStream('access.log')
function access(log) {
    writeLog(accessWriteStream, log)
}

module.exports = {
    access
}

7.7 日志拆分,日志分析

image.png
image.png
image.png

为了效率比较高,用shell脚本拆分日志。crontab,定时执行任务。

#!/bin/sh
cd /Users/huziyin/Documents/Self-study/imook-nodejs/blog-1/logs
cp access.log $(date +%Y-%m-%d).access.log
echo "">access.log

版权声明
本文为[米姐胡扯扯]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000037783523