对项目后端进行写日志
- 案例一:文件操作(原生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
- 测试