node JS 项目中日志的应用、拆分及分析

一、nodeJS 中的日志

  1. 日志,如下所示:
  • 访问日志 access logserver 端最重要的日志
  • 自定义日志,包括自定义事件、错误记录等
  • nodejs 文件操作,nodejs stream
  • 日志功能开发和使用
  • 日志文件拆分,日志内容分析
  • 日志要存储到文件中,不存储到 mysqlredis
  1. 日志的简单应用,代码如下所示:
// process.stdin.pipe(process.stdout)

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

// server.listen(8000)


// 复制文件
// const fs = require('fs')
// const path = require('path')

// const fileName1 = path.resolve(__dirname, 'data.txt')
// const fileName2 = path.resolve(__dirname, 'data-back.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')
// })


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)
  1. 日志在 node JS 项目中的应用,如下所示:
  • log.js,代码如下所示:
      const fs = require('fs')
      const path = require('path')
      
      // 写日志
      function writeLog(writeStram, log) {
          
          
        writeStram.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
      }
    
  • app.js,部分代码如下所示:
    // 记录 access log
    access(`${
            
            req.method} -- ${
            
            req.url} -- ${
            
            req.headers['user-agent']} --  ${
            
            Date.now()}`)
    
  1. IO 操作的性能瓶颈,如下所示:
  • IO,包括 网络IO 和 文件IO
  • 相比于 CPU 计算和内存读写,IO 的突出特点就是慢
  • 在有限的硬件资源下提高 IO 的操作效率
  1. 日志拆分,如下所示:
  • 日志内容会慢慢积累,放在一个文件中不好处理
  • 按时间划分日志文件,如 2019-02-10.access.log
  • 实现方式:Linuxcrontab 任务,即定时任务
  1. crontab,如下所示:
  • 设置定时任务,格式:**** command
  • access.log 拷贝并重命名为 2019-02-10.access.log
  • 清空 access.log 文件,继续积累日志
  1. 日志拆分在 node JS 项目中的应用,copy.sh,代码如下所示:
#!/bin/sh
cd /node-blog/blog1
cp access.log $(date + %Y-%m-%d).access.log
echo "" > access.log
  1. 日志分析,如下所示:
  • 如针对 access.log 日志,分析 Chrome 的占比
  • 日志是按行存储的,一行就是一条日志
  • 使用 nodejsreadline,基于 stream,效率高
  1. 日志分析在 node JS 项目中的应用,readline.js,代码如下所示:
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

// 逐行读取
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)
})

猜你喜欢

转载自blog.csdn.net/weixin_42614080/article/details/110848223