KOA 中间件实现方式(二)

这是我参与更文挑战的第 11 天,活动详情查看: 更文挑战前端

Lynne,一个能哭爱笑永远少女心的前端开发工程师。身处互联网浪潮之中,热爱生活与技术。web

前言

实现一个 KOA 中间件,第一篇已经讲过了日志中间件中的 设置信息段和获取配置后的log4js对象。服务器

今天就来说一讲 最关键的模块 --- log日志中间件开发(logger.js)markdown

log日志中间件开发(logger.js)

log日志中间件作了哪些工做

一句话来讲就是,主要利用中间件能够访问请求和响应内容,输出上下文中的请求和响应中的日志内容。app

具体实现代码

export default (options) => {
    const contextLogger = {}; //后期赋值给ctx.log
    const { env, appLogLevel, dir, serverIp, projectName } = Object.assign({}, baseInfo, options || {});
    // 取出通用配置(项目名,服务器请求IP)
    const commonInfo = { projectName, serverIp };
    // 上一节介绍的函数模块 - 通用获取配置后的log4js对象
    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使用基本配置和流程解析能够看前面log4js的文章。至此,完成一个简单的日志中间件。koa