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模块,所以信息不会输出到掌握台
后期斟酌
- 是不是须要对日记举行数据库存储,举行日记耐久化;
- 斟酌到不能够对日记纪录后一向保留,关于一个月或许一周之前的日记能够没有必要在举行存储了,须要开辟设置定时自动删除逾期日记文件(获数据库日记纪录)
学无止境,积聚点滴;把小简朴变成大简朴。
- 假如这篇文章对你有所收成,请留在你的小心心!
- 往期文章引荐: