总结:应用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的操作效率。


流的概念:
边看边加载。节俭很多的硬件资源。

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 = 0let 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 Streamfunction 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 日志拆分,日志剖析



为了效率比拟高,用shell脚本拆分日志。crontab,定时执行工作。

#!/bin/shcd /Users/huziyin/Documents/Self-study/imook-nodejs/blog-1/logscp access.log $(date +%Y-%m-%d).access.logecho "">access.log