}
})
server.listen(8000);
//使用stream进行文件的copy,实现部分的代码如下:
const fs = require(‘fs’);
const path = require(‘path’);
const fileName1 = path.resolve(__dirname, ‘data.txt’);
const fileName2 = path.resolve(__dirname, ‘data-bak.txt’);
//创建一个读文件与一个写文件
const readStream = fs.createReadStream(fileName1);
const writeStream = fs.createWriteStream(fileName2);
readStream.pipe(writeStream);
readStream.on(‘data’ , chunk => {
console.log(chunk.toString());
})
readStream.on(‘end’,() =>{
console.log(‘copy done’);
})
//将文件中的内容读入,并通过res返回,具体的实现代码如下
const http = require(‘http’);
const fs = require(‘fs’);
const path = require(‘path’);
const fileName1 = path.resolve(__dirname, ‘data.txt’);
const readStream = fs.createReadStream(fileName1)
const server = http.createServer((req,res) => {
if(req.method === ‘GET’){
readStream.pipe(res);
}
})
server.listen(8000);
至此为止关于流的操作到此就结束,下面部分讲解的就是如何使用stream来处理日志
1.在博客的服务器端去书写日志
首先需要去创建一个logs的文件夹,里面放的是各种的日志文件,然后在src目录下创建一个工具文件并且命名为utils并在这个文件下面去创建一个logs.js的文件,用于去写文件 具体的实现代码如下:首先引入nodejs自带的文件fs以及path
const fs = require(‘fs’);
const path = require(‘path’);
然后再生成一个写的文件流
//生成写文件流
const createWriteStream = (fliename) => {
//join()中的内容所说的是上两级目录下的logs下的文件
const fullFileName = path.join(__dirname, ‘…/’ ,‘…/’ , ‘logs’ ,fliename);
const writeStream = fs.createWriteStream(fullFileName , {
flags: ‘a’ //表示在文件中追加内容
})
return writeStream;
}
然后再创建一个写日志的文件
const writeLog = (writeStream, log) => {
writeStream.write(log + ‘\n’); //写入内容
}
最后就是写访问日志,再将这个方法导出
//写访问日志
const accessWriteStream = createWriteStream(‘access.log’);
const access = (log) => {
writeLog(accessWriteStream ,log);
}
module.exports = {
access
}
最后在app.js文件中去记录这个文件主要记录的内容有
req.method req.url req.headers[‘user-agent’] Date.now()
最后进行的就是日志拆分,那么为什么要进行日志的拆分呢,原因是我们需要对日志进行定时的管理,因为存储的文件是有限的。对于日志的拆分我们做一个了解即可,因为在这个部分由专门的运维人员来进行,在这里就主要叙述日志拆分的过程
**1.日志的内容会随着时间的增加而增多,放在一个文件当中不好处理,因此需要我们去进行拆分
2.日志的拆分方式,在通常的情况下采用的方式都是按照时间来划分
3.实现方式通常的情况下都是linux的crontab命令,即定时任务来完成
4.虽然node也可以来对日志进行拆分,但是去定时的启动,其是在操作系统之上的软件部分定义的,而linux则是定义在
操作系统之上的,所以可以完成定时任务
5.设置定时任务,其格式: *****command,*****代表需要定时更新日志的时间
6.将access.log拷贝并且重新命名为年月日.access.log
7.清空access.log文件,继续积累日志**
具体的实现过程如下:
1.首先是在utils文件下,新建copy.sh文件(在进行日志拆分的时候要记住需要在linux系统下才能完成)、
2.在copy.sh中写入下面的代码:
! bin/src
cd 日志文件路径
cp access.log $(date +%Y-%m-%d).access.log //%Y-%m-%d表示年月日
echo “” > access.log //将access.log文件中的内容清空
定时拆分日志时,需要使用crontab -e进入编辑
然后使用* 0 * * * sh加上日志文件目录
然后就可以定时的触发脚本
在nodejs中提供了一个readline主要用于去分析日志 日志中的存储是一条一条数据这样的形式所储存的、因此在这里就可以很轻易的来分析日志,对于不同的功能由不同的处理方式,在下面实现的功能中主要是去分析所有的浏览器中chrome所占的比例,具体的分析日志的代码如下:
const fs = require(‘fs’);
const path = require(‘path’);
const readline = require(‘readline’);
//获取文件名
const fileName = path.join(__dirname, ‘…/’ , ‘…/’ , ‘logs’ ,‘access.log’);
//创建 read stream
const readStream = fs.createReadStream(fileName);
//创建readline对象
const rl = readline.createInterface({
input : readStream
})
let chromeNum = 0;
let sum = 0;
最后
编程基础的初级开发者,计算机科学专业的学生,以及平时没怎么利用过数据结构与算法的开发人员希望复习这些概念为下次技术面试做准备。或者想学习一些计算机科学的基本概念,以优化代码,提高编程技能。这份笔记都是可以作为参考的。