Koa日记中间件封装开辟

Koa日记中间件开辟封装

关于一个服务器运用来讲,日记的纪录是必不可少的,我们须要运用其纪录项目顺序天天都做了什么,什么时候发作过毛病,发作过什么毛病等等,便于往后回忆、及时掌握服务器的运转状况,复原题目场景。

日记的作用

  1. 纪录服务器顺序运转状况;
  2. 协助开辟者疾速捕捉毛病,定位以及决解毛病。

日记中间件开辟工具log4js

  • 在node当中没有自带的日记模块,所以须要运用第三方模块
  1. 运用模块:log4js
  2. 装置: npm i log4js -S
  3. logsjs官方文档
  4. 日记分类:

    • 接见日记: 纪录客户端对项目的接见,主假如 http 要求。用于协助革新和提拔网站的机能和用户体验;
    • 运用日记: 项目标记和纪录位置打印的日记,包含涌现异常情况,轻易查询项目的运转状况和定位bug(包含了debug、info、warn 和 error品级别)。

日记品级

  • 假如设置了日记品级,则其只能纪录日记品级比设置的更高级别的日记信息
  • 日记品级图

《Koa日记中间件封装开辟》

  • 如设置level: 'error',则只能输出error,fatar,mark级别的日记信息

日记中间件开辟

  1. 设置须要日记须要纪录的信息段(log_info.js)
export default (ctx, message, commonInfo) => {
    const {
      method,  // 要求要领
      url,          // 要求链接
      host,      // 发送要求的客户端的host
      headers      // 要求中的headers
    } = ctx.request;
    const client = {
      method,
      url,
      host,
      message,
      referer: headers['referer'],  // 要求的源地址
      userAgent: headers['user-agent']  // 客户端信息 装备及浏览器信息
    }
    return JSON.stringify(Object.assign(commonInfo, client));
}
  1. 设置通用猎取设置后的log4js对象(logger.js)
const getLog = ({env, appLogLevel, dir}, name) => {
    
    //log4js基础申明设置项,可自定义设置键名,用于categories.appenders自定义拔取
    let appenders = {
        // 自定义设置项1
        cheese: {
            type: 'dateFile', //输出日记范例
            filename: `${dir}/task`,  //输出日记途径
            pattern: '-yyyy-MM-dd.log', //日记文件后缀名(task-2019-03-08.log)
            alwaysIncludePattern: true
        }
    }
    // 假如为开辟环境设置在掌握台上打印信息
    if (env === "dev" || env === "local" || env === "development") {
        // 自定义设置项2
        appenders.out = {
          type: "stdout"
        }
    }
    // log4js设置
    let config = {
        appenders,
        //作为getLogger要领猎取log对象的键名,default为默许运用
        categories: {
          default: {
            appenders: Object.keys(appenders), // 取appenders中的说有设置项
            level: appLogLevel
          }
        }
    }
    log4js.configure(config) //运用设置项
    return log4js.getLogger(name)// 这个cheese参数值先会在categories中找,找不到就会默许运用default对应的appenders,信息会输出到yyyyMMdd-out.log
}
  1. log日记中间件开辟(logger.js)
export default (options) => {
    const contextLogger = {}; //后期赋值给ctx.log
    const { env, appLogLevel, dir, serverIp, projectName } = Object.assign({}, baseInfo, options || {});
    // 掏出通用设置(项目名,服务器要求IP)
    const commonInfo = { projectName, serverIp };

    const logger = getLog({env, appLogLevel, dir},'cheese');

    return async (ctx, next) => {
        const start = Date.now(); //日记纪录最先时候
        // 将日记范例赋值ctx.log,后期中间件特别位置须要纪录日记,可直接运用ctx.log.error(err)纪录差别范例日记
        methods.forEach((method, i) => {
            contextLogger[method] = (message) => {
                logger[method](logInfo(ctx, message, commonInfo))
            }
        })
        ctx.log = contextLogger;
        // 实行中间件
        await next()
        // 完毕时候
        const responseTime = Date.now() - start;
        // 将实行时候纪录logger.info
        logger.info(logInfo(ctx,
            {
                responseTime: `相应时候为${responseTime/1000}s`
            }, commonInfo)
        )
    }
}
  1. 中间件运用(app.js)
import Log from '../log/logger';
...
app.use(Log({
        env: app.env,  // koa 供应的环境变量
        projectName: 'back-API',
        appLogLevel: 'debug',
        dir: 'logs',
        serverIp: ip.address()
    }))
  1. 其他特别位置须要日记纪录运用
ctx.log.error(err.stack); //纪录毛病日记
ctx.log.info(err.stack); // 纪录信息日记
ctx.log.warn(err.stack); // 纪录正告日记
...
  1. 运转截图

《Koa日记中间件封装开辟》

log4js运用基础设置和流程剖析

  1. 设置设置项,
// 设置项情势
{
    appenders:{
        [自定义key]:{}
    },
    categories:{
    }
}
// 设置
config: {
    appenders:{
        // 每一个属性能够看作为一个设置模块
        out: {
            type: 'dateFile', //输出日记范例
            filename: `log/task`,  //输出日记途径
            pattern: '-yyyy-MM-dd.log', //日记文件后缀名(task-2019-03-08.log)
            ...//详细设置看官网
        },
        error: {
            type: 'dateFile',
            filename: 'log/error',
            pattern: '-yyyy-MM-dd.log'',
            "alwaysIncludePattern": true
        },
        stdout: { type: 'stdout' }, //在掌握台上打印信息
    },
    // 经由过程categories来掏出给log4js按需设置,返回设置后的log4js对象,每一个属性设置相当于一个差别的log4js设置对象进口;default为默许进口(getLogger()找不到进口时默许运用default)
    categories:{
        // 设置默许进口,运用appenders中的'stdout','out'设置模块,纪录trace以上品级日记
        default: { appenders: ['stdout','out'], level: 'trace' },
        // 设置error门进口,运用appenders中的'stdout','err'设置模块,纪录error以上品级日记
        error : {appenders: ['err'], level: 'error'}
    }
}
  1. 运用let logger_out = log4js.getLogger('app');

    • log4js.getLogger('app')查找特定log4js对象流程:先依据app参数值在categories中找,发明没有app,然后就会默许运用default对应的appenders举行设置,即信息会输出到log/task-yyyy-mm-dd.log文件中,并且会输出到掌握台
  2. 运用let logger_out = log4js.getLogger('error');

    • 依据error参数值在categories中找,发明没有具有error设置,然后就会运用error对应的appenders举行设置,即信息会输出到log/error-yyyy-mm-dd.log文件中,由于error的设置项appenders中没有运用stdout模块,所以信息不会输出到掌握台

后期斟酌

  1. 是不是须要对日记举行数据库存储,举行日记耐久化;
  2. 斟酌到不能够对日记纪录后一向保留,关于一个月或许一周之前的日记能够没有必要在举行存储了,须要开辟设置定时自动删除逾期日记文件(获数据库日记纪录)

学无止境,积聚点滴;把小简朴变成大简朴。

  • 假如这篇文章对你有所收成,请留在你的小心心!
  • 往期文章引荐:
  1. React你知多少
  2. Git经常使用操纵
    原文作者:keywords
    原文地址: https://segmentfault.com/a/1190000018433489
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞