总结:应用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