一、nodeJS 中的日志
- 日志,如下所示:
- 访问日志
access log
,server
端最重要的日志
- 自定义日志,包括自定义事件、错误记录等
nodejs
文件操作,nodejs stream
- 日志功能开发和使用
- 日志文件拆分,日志内容分析
- 日志要存储到文件中,不存储到
mysql
和 redis
中
- 日志的简单应用,代码如下所示:
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(8344)
- 日志在
node JS
项目中的应用,如下所示:
log.js
,代码如下所示: const fs = require('fs')
const path = require('path')
function writeLog(writeStram, log) {
writeStram.write(log + '\n')
}
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
}
app.js
,部分代码如下所示:
access(`${
req.method} -- ${
req.url} -- ${
req.headers['user-agent']} -- ${
Date.now()}`)
IO
操作的性能瓶颈,如下所示:
IO
,包括 网络IO
和 文件IO
- 相比于
CPU
计算和内存读写,IO
的突出特点就是慢
- 在有限的硬件资源下提高
IO
的操作效率
- 日志拆分,如下所示:
- 日志内容会慢慢积累,放在一个文件中不好处理
- 按时间划分日志文件,如
2019-02-10.access.log
- 实现方式:
Linux
的 crontab
任务,即定时任务
crontab
,如下所示:
- 设置定时任务,格式:
**** command
- 将
access.log
拷贝并重命名为 2019-02-10.access.log
- 清空
access.log
文件,继续积累日志
- 日志拆分在
node JS
项目中的应用,copy.sh
,代码如下所示:
#!/bin/sh
cd /node-blog/blog1
cp access.log $(date + %Y-%m-%d).access.log
echo "" > access.log
- 日志分析,如下所示:
- 如针对
access.log
日志,分析 Chrome
的占比
- 日志是按行存储的,一行就是一条日志
- 使用
nodejs
的 readline
,基于 stream
,效率高
- 日志分析在
node JS
项目中的应用,readline.js
,代码如下所示:
const fs = require('fs')
const path = require('path')
const readline = require('readline')
const fileName = path.join(__dirname, '../', '../', 'logs', 'access.log')
const readStream = fs.createReadStream(fileName)
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) {
chromeNum++
}
})
rl.on('close', () => {
console.log('chrome 占比:', + chromeNum / sum)
})