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

微信扫一扫,分享到朋友圈

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

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

微信扫一扫,分享到朋友圈

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

嫦娥四号和玉兔二号迎来第24个月昼:月球最大撞击坑被解密

上一篇

Launcher计划明年3月进行火箭引擎测试:公司仅有8名全职职工

下一篇

你也可能喜欢

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

长按储存图像,分享给朋友