Node.js 从零开发 web server博客项目[日志]

web server博客项目

  1. Node.js 从零开发 web server博客项目[项目介绍]
  2. Node.js 从零开发 web server博客项目[接口]
  3. Node.js 从零开发 web server博客项目[数据存储]
  4. Node.js 从零开发 web server博客项目[登录]
  5. Node.js 从零开发 web server博客项目[日志]
  6. Node.js 从零开发 web server博客项目[安全]
  7. Node.js 从零开发 web server博客项目[express重构博客项目]
  8. Node.js 从零开发 web server博客项目[koa2重构博客项目]
  9. Node.js 从零开发 web server博客项目[上线与配置]

介绍

  • 系统没有日志, 就等于人没有眼睛----抓瞎
  • 第一 , 访问日志 access log ( server 端最重要的日志 )
  • 第二 , 自定义日志 ( 包括自定义事件 . 作物记录等 )

nodejs 文件操作 , nodejs stream

操作文件有很大的性能瓶颈, 必须使用 stream 方式来节省 CPU和 内存, 以提升性能

日志功能开发和使用

  • 创建src/utils/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, {
        flags: 'a'
    })
    return writeStream
}

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

module.exports = {
    access
}
使用

app.js

const { access } = require('./src/utils/log')
...
const serverHandle = (req, res) => {
	// 记录 access log
	access(`${req.method} -- ${req.url} -- ${req.headers['user-agent']} -- ${Date.now()}`)
...
  • 创建src/logs/access.log``error.log``event.log

日志文件拆分 , 日志内容分析

拆分

  • 日志内容会慢慢积累, 放在一个文件中不好处理
  • 按时间划分日志文件, 如 2019-02-10.access.log
  • 实现方式: Linux 的 crontab 命令 , 即定时任务
  • crontab
    • 设置定时任务 , 格式 : * * * * * command (分 , 时, 天, 月, 周)
    • 将 access.log 拷贝并重命名为 2019-02-10.access.log
    • 清空 access.log 文件 , 继续累积日志

代码实现

  • 创建utils/copy.sh
#!/bin/sh
cd D:\WebDev-Vdo\Node.js 从零开发 web server博客项目 前端晋升全栈工程师必备\手敲代码\blog-1\logs
cp access.log $(date +%Y-%m-%d).access.log
echo "" > access.log

分析

了解访问情况, 如浏览器内核占比

代码实现
  • 创建utils/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)
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值