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

相關文章
相關標籤/搜索