资讯专栏INFORMATION COLUMN

Koa日志中间件封装开发

Aklman / 1654人阅读

摘要:日志的作用记录服务器程序运行状态帮助开发者快速捕获错误,定位以及决解故障。日志中间件开发工具在当中没有自带的日志模块,所以需要使用第三方模块使用模块安装官方文档日志分类访问日志记录客户端对项目的访问,主要是请求。

Koa日志中间件开发封装
对于一个服务器应用来说,日志的记录是必不可少的,我们需要使用其记录项目程序每天都做了什么,什么时候发生过错误,发生过什么错误等等,便于日后回顾、实时掌握服务器的运行状态,还原问题场景。
日志的作用

记录服务器程序运行状态;

帮助开发者快速捕获错误,定位以及决解故障。

日志中间件开发工具log4js

在node当中没有自带的日志模块,所以需要使用第三方模块

使用模块:log4js

安装: npm i log4js -S

logsjs官方文档

日志分类:

访问日志: 记录客户端对项目的访问,主要是 http 请求。用于帮助改进和提升网站的性能和用户体验;

应用日志: 项目标记和记录位置打印的日志,包括出现异常情况,方便查询项目的运行状态和定位bug(包含了debug、info、warn 和 error等级别)。

日志等级

如果配置了日志等级,则其只能记录日志等级比设置的更高级别的日志信息

日志等级图

如配置level: "error",则只能输出error,fatar,mark级别的日志信息

日志中间件开发

设置需要日志需要记录的信息段(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));
}

设置通用获取配置后的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
}

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)
        )
    }
}

中间件使用(app.js)

import Log from "../log/logger";
...
app.use(Log({
        env: app.env,  // koa 提供的环境变量
        projectName: "back-API",
        appLogLevel: "debug",
        dir: "logs",
        serverIp: ip.address()
    }))

其他特殊位置需要日志记录使用

ctx.log.error(err.stack); //记录错误日志
ctx.log.info(err.stack); // 记录信息日志
ctx.log.warn(err.stack); // 记录警告日志
...

运行截图

log4js使用基本配置和流程解析

设置配置项,

// 配置项形式
{
    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"}
    }
}

使用let logger_out = log4js.getLogger("app");

log4js.getLogger("app")查找特定log4js对象流程:先根据app参数值在categories中找,发现没有app,然后就会默认使用default对应的appenders进行配置,即信息会输出到log/task-yyyy-mm-dd.log文件中,并且会输出到控制台

使用let logger_out = log4js.getLogger("error");

根据error参数值在categories中找,发现没有拥有error配置,然后就会使用error对应的appenders进行配置,即信息会输出到log/error-yyyy-mm-dd.log文件中,因为error的配置项appenders中没有使用stdout模块,所以信息不会输出到控制台

后期考虑

是否需要对日志进行数据库存储,进行日志持久化;

考虑到不可能对日志记录后一直保存,对于一个月或者一周以前的日志可能没有必要在进行存储了,需要开发设置定时自动删除过期日志文件(获数据库日志记录)

参考:

log4js配置

Node.js 之 log4js 完全讲解

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

如果这篇文章对你有所收获,请留在你的小心心!

往期文章推荐:

React你知多少

Git常用操作

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109000.html

相关文章

  • iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 showImg(https://segmentfault.com/img/remote/1460000012932474?w=1606&h=968); log 日志中间件 最困难的事情就是认识自己。 在一个真实的项目中,开发只是整个投入的一小部分,版本迭代和后期维护占了极其重要的部分。项目上线...

    stefan 评论0 收藏0
  • Koa 系列 — 如何编写属于自己的 Koa 间件

    摘要:原本中的路由模块已经被移除,改为通过中间件的方式实现。的中间件就是函数,可以是函数,或是普通函数,以下是官网的示例函数普通函数中间件可以通过官方维护的仓库查找获取,也可以根据需求编写属于自己的中间件。 Koa 是一个由 Express 原班人马打造的新的 web 框架,Koa 本身并没有捆绑任何中间件,只提供了应用(Application)、上下文(Context)、请求(Reques...

    teren 评论0 收藏0
  • learning koa1.x

    摘要:定义框架前端开发框架,它是一款基于语法的网页端开发框架。它类似于框架,可以快速开发服务,方便快捷。 定义 koa框架 web前端开发框架,它是一款基于es6语法的网页端开发框架。它类似于express框架,可以快速开发服务,方便快捷。 api手册http://koa.bootcss.com/ 开发实战篇 首先,创建package.json 使用版本为1.x npm init #依赖 d...

    gaosboy 评论0 收藏0
  • node服务端渲染(完整demo)

    摘要:简介搭建多页面服务端渲染技术点搭建服务创建页面路由模板引擎组合打包多页面端异步请求服务端日志打印项目源码运行一现代服务端渲染的由来服务端渲染概念是指,浏览器向服务器发出请求页面,服务端将准备好的模板和数据组装成完整的返回给浏览器展示前端后 简介 nodejs搭建多页面服务端渲染 技术点 koa 搭建服务 koa-router 创建页面路由 nunjucks 模板引擎组合html ...

    cheukyin 评论0 收藏0
  • 规范化安全开发 KOA 手脚架

    摘要:规范化安全开发手脚架刚接触的时候心理也有一点点担忧,是一个轻量级的框架,这意味着我们想要做好一个理想的手脚架需要自己去改变很多东西,一些流行的第三方更要做好处理,那么时间成本会逐级的提高。 规范化安全开发 KOA 手脚架 刚接触 KOA 的时候心理也有一点点担忧,KOA 是一个轻量级的框架,这意味着我们想要做好一个理想的手脚架需要自己去改变很多东西,一些流行的 npm 第三方更要做好处...

    eechen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<