這是我參與更文挑戰的第 11 天,活動詳情查看: 更文挑戰前端
Lynne,一個能哭愛笑永遠少女心的前端開發工程師。身處互聯網浪潮之中,熱愛生活與技術。web
實現一個 KOA 中間件,第一篇已經講過了日誌中間件中的 設置信息段和獲取配置後的log4js對象。服務器
今天就來說一講 最關鍵的模塊 --- log日誌中間件開發(logger.js)markdown
一句話來講就是,主要利用中間件能夠訪問請求和響應內容,輸出上下文中的請求和響應中的日誌內容。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)
)
}
}
複製代碼
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