总结:使用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 = 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 日志拆分,日志分析
为了效率比较高,用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