第六天:对项目后端日志存储

上一篇

对项目后端进行写日志
  • 案例一:文件操作(原生nodejs)
    (1)项目目录:
    在这里插入图片描述
    (2)读取文件
const fs = require('fs')
const path = require('path')

//读取文件内容
fs.readFile(fileName, (err,data) => {
    if (err) {
        console.error(err)
        return
    }
    //data是二进制1类型,需要转化为字符串
    console.log(data.toString())
})

在这里插入图片描述
(3)写入文件

//写入文件
const content = '这是新写入的内容\n'
const opt = {
   flag:'a' //追加写入 覆盖用 ‘w’
}
fs.writeFile(fileName, content, opt, (err) => {
    if (err) {
        console.error(err)
    }
})



//判断文件是否存在
fs.exists(fileName, (exist) => {
    console.log(exist)
})

在这里插入图片描述
案例一弊端:对文件的读取和写入都是先一次性操作的。不适合到日志

比如:读取文件是一次性全部读出后,在先控制台输出,一旦文件内容过大时,会占用系统的内存

解决方法:通过数据流的形式(边读取边输出)


  • 案例二:通过数据流的形式来对文件进行读写操作 (管道
    (1)项目目录
    在这里插入图片描述
    (2)案例2.1:从控制台输入内容后立即返回到控制台
process.stdin.pipe(process.stdout)

在这里插入图片描述
(3)案例2.2:浏览器发送请求到后端,后端立即返回请求的内容

const http = require('http')
const server = http.createServer((req, res) => {
    if (req.method === 'POST') {
        req.pipe(res)  // 最主要
    }
})
server.listen(8000)

(4)案例2.3:将文件内容返回到客户端

const http = require('http')
const fs = require('fs')
const path = require('path')
const fileName1 = path.resolve(__dirname, 'data.txt')
const server = http.createServer((req, res) => {
    if (req.method === 'GET') {
        const readStream = fs.createReadStream(fileName1)
        readStream.pipe(res)
    }
})
server.listen(8000)

(5)案例2.4:对文件进行复制(data.txt复制到data-back.txt)

 // 复制文件
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')
})

综上:对于写日志应该选择数据流的形式

回到项目中:
  • 项目目录(logs目录是存放日志,log.js是将请求存放到日志中
    在这里插入图片描述
  • log.js
const fs = require('fs')
const path = require('path')

// 写日志
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, {
        flag:'a'
    })
    return writeStream
}

// 写访问日志
const accessWriteStream = createWriteStream('access.log')
function access(log) {
    writeLog(accessWriteStream, log)
}

module.exports = {
    access
}
  • app.js
    在这里插入图片描述
  • 测试
    在这里插入图片描述

1、express重构博客项目


2、koa2重构博客项目

3、项目下载链接点这里


欢迎访问我的个人博客

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁月可贵

您的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值