代码地址如下:
http://www.demodashi.com/demo/12466.html

 之前做的项目是采用 Express 框架进行搭建的,其中的日志管理采用了 winston + Postgresql + sequelize的形式, 最近倒弄 Koa2 框架,于是就想着尝试采用另一种方式进行访问日志的管理,就想到了 log4js。关于 log4js 的介绍在这里就不多叙述了,想了解请点击  log4js详细介绍

 说到数据持久化,最普遍的无非就两种方式:

  • 文件存储
  • 数据库存储

 本文将以log4js为主线,分别对这两种形式进行实现。

持久化至文件

 log4js 输入日志到文件有两种形式:

  • file 输出到文件, 指定单一文件名称, 例如: default.log
  • dateFile 输出到文件,文件可以按日期模式滚动,例如: default-2017-02-03.log

直接上代码:

// log4js.js
const log4js = require('log4js')
log4js.configure({
appenders: {
error: {
type: 'file', //日志类型
category: 'errLogger', //日志名称
filename: __dirname + '/../logs/error.log/', //日志输出位置,当目录文件或文件夹不存在时自动创建
maxLogSize: 104800, // 文件最大存储空间
backups: 100 //当文件内容超过文件存储空间时,备份文件的数量
},
response: {
type: 'dateFile',
category: 'resLogger',
filename: __dirname + '/../logs/responses/',
pattern: 'yyyy-MM-dd.log', //日志输出模式
alwaysIncludePattern: true,
maxLogSize: 104800,
backups: 100
}
},
categories: {
error: {appenders: ['error'], level: 'error'},
response: {appenders: ['response'], level: 'info'},
default: { appenders: ['response'], level: 'info'}
},
replaceConsole: true
})

日志配置文件我们已经完成,在这里定义了两种形式的日志,分别是 errLogger 错误日志, resLogger 响应日志。

接下来我们将这两种日志进行自定义格式化输出:

// log4js.js
const {formatError, formatRes} = require('./formatLog')
let logger = {} let errorLogger = log4js.getLogger('error')
let resLogger = log4js.getLogger('response') // 封装错误日志
logger.errLogger = (ctx, error, resTime) => {
if(ctx && error) {
errorLogger.error(formatError(ctx, error, resTime))
}
} // 封装响应日志
logger.resLogger = (ctx, resTime) => {
if(ctx) {
resLogger.info(formatRes(ctx, resTime))
}
}
// formatLog.js
let formatError = (ctx, err,costTime) => {
let method = ctx.method
let url = ctx.url
let body = ctx.request.body
let userAgent = ctx.header.userAgent
return {method, url, body, costTime, err}
} let formatRes = (ctx,costTime) => {
let method = ctx.method
let url = ctx.url
let body = ctx.request.body
let response = ctx.response
return {method, url, body, costTime, response}
} module.exports = {formatError, formatRes}

在我们的应用中使用我们自定义的日志模型

//app.js
const log4js = require('./utils/log4js') // logger
app.use(async(ctx, next) => {
const start = new Date()
await next()
const ms = new Date() - start
log4js.resLogger(ctx, ms)
}) app.on('error', (err, ctx) => {
log4js.errLogger(ctx, err)
console.error('server error', err, ctx)
});

此时我们的访问信息都已被输出到了项目 logs 文件夹下面。

持久化到 MongoDB

我们采用 Mongoose 驱动进行与 MongoDB 数据库进行交互。关于 Mongoose 的使用请查看 Mongoose使用详情

首先我们先定义一个存放日志的数据模型 Log,如下:

//log.js
let log = new Schema({
level: {type: String},
message: {type: String},
info: {
method: String,
url: String,
costTime: Number,
body: String,
response: {
status: Number,
message: String,
header: String,
body: String
}
}
}, {
versionKey: false
}) module.exports = mongoose.model('logs', log)

日志内容存储到数据库中,实现如下log2db.js

//log2db.js
const {Log} = require('../models') let log2db = (msg, level, info) => {
let log = {
level: level || 'info',
message: msg,
info: {
method: info.method,
url: info.url,
costTime: info.costTime,
body: JSON.stringify(info.body),
response: {
status: info.response.status,
message: info.response.message,
header: JSON.stringify(info.response.header),
body: JSON.stringify(info.response.body)
}
}
}
Log.create(log, (err, res) => {
if(err) {console.log(err)}
})
} module.exports = log2db

修改我们上边封装的两种日志类型,添加 log2db 如下:

// 封装错误日志
logger.errLogger = (ctx, error, resTime) => {
if(ctx && error) {
log2db('ErrorRequest', 'error', formatError(ctx, error, resTime))
errorLogger.error(formatError(ctx, error, resTime))
}
} // 封装相应日志
logger.resLogger = (ctx, resTime) => {
if(ctx) {
log2db('RequestInfo', 'info', formatRes(ctx, resTime))
resLogger.info(formatRes(ctx, resTime))
}
}

运行效果

OK, 我们重启服务器,进行访问,然后通过 RoboMongo 进行查看我们的 Log 集合,就会发现我们的访问信息都已经记录了下来。

项目结构图



Koa2 + Mongoose + Log4js 持久化日志

代码地址如下:
http://www.demodashi.com/demo/12466.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

Koa2 + Mongoose + Log4js 持久化日志的更多相关文章

  1. node 日志 log4js 错误日志记录

    SET DEBUG=mylog:* & npm start 原文出处:http://blog.fens.me/nodejs-log4js/ 1. 默认的控制台输出 我们使用express框架时 ...

  2. Zookeeper(四))持久化日志文件

    Zookeeper(四))持久化日志文件 持久化用途 存储两种文件 snapshot:内存快照 log:事务日志,类似MySQL的binlog,存储数据节点的操作日志 问题 序列化的本质其实就是将原数 ...

  3. koa2学习笔记02 - 给koa2添加系统日志 —— node日志管理模块log4js

    前言 没有日志系统的后台应用是没有灵魂的, 平时工作中每次我们遇到接口报错的时候, 都会叫后台的童鞋看下怎么回事, 这时后台的童鞋都会不慌不忙的打开一个骚骚的黑窗口. 一串噼里啪啦的命令输进去, 哐哐 ...

  4. koa2+mongoose搭建框架模型

    由于学的是java,所以此框架多少有点java的影子,我觉得不必排斥语言,只要思想好,所有语言均可以通用.项目分以下几层 app.js项目启动入口,类似于main函数 controller-view层 ...

  5. pm2 配合log4js处理日志

    1.pm2启动时通常会发现log4js记录不到日志信息: 2.决解方案,安装pm2的pm2-intercom进程间通信模块 3.在log4js的配置文件logger.js里添加如下命令: pm2: t ...

  6. Koa2+mongoose

    为什么选择Koa koa是Express框架同个公司的产品,是开发者在node7.0版本之后使用promise的api把express再次封装了一次,起名Koa,==Koa=Express+Promi ...

  7. koa2+log4js+sequelize搭建的nodejs服务

    主要参考http://www.jianshu.com/p/6b816c609669这篇文章 npm安装使用国内taobao镜像,速度更快些 npm --registry https://registr ...

  8. 玩转Nodejs日志管理log4js(转)

    转自:http://blog.fens.me/nodejs-log4js/ 前言 日志对任何的应用来说都是至关重要的.在Nodejs中使用express框架并没有自带的日志模块,我们可以选择log4j ...

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

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分 ...

随机推荐

  1. [BZOJ2036]聪明的阿卑多

    [BZOJ2036]聪明的阿卑多 试题描述 也许你从没听说过阿卑多,但你一定知道他爷爷的爷爷的爷爷,那就是聪明绝顶的阿凡提先生.是的,阿卑多也是个聪明的小孩. 一天,阿卑多骑着他的小毛驴,在小镇上晃悠 ...

  2. [CQOI2014][bzoj3504] 危桥 [最大流]

    题面 传送门 思路 这道题中惟一的特别之处,就在于"危桥"这一个只能走两次的东西 我的第一想法是做一个dp,但是这道题只需要能不能走,也没有必要 网络流?貌似是个很好的选择 我们把 ...

  3. BZOJ1396&2865 识别子串 【后缀自动机 + 线段树】

    题目 输入格式 一行,一个由小写字母组成的字符串S,长度不超过10^5 输出格式 L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. 输入样例 agoodcookcooksg ...

  4. 【一个比较bug free的二分写法】

    lower_bound: [l, r)区间内大于等于val的第一个位置 int lower_bound(int l, int r, int val){ while(l < r){ ); if(a ...

  5. APK包与类更改分析

    360APK包与类更改分析 1 题目要求 这是360的全球招募无线攻防中的第二题,题目要求如下: 1)请以重打包的形式将qihootest2.apk的程序包名改为 "com.qihoo.cr ...

  6. python实现贪吃蛇

    贪吃蛇的算法还是比较简单的,蛇的移动我是通过不停添加一个head方块,然后判断应该加到蛇头的哪个方向,加完后删掉蛇尾就行了,如果吃到食物就不删蛇尾. 只是一个贪吃蛇只需要70行代码左右就可以了,后来又 ...

  7. Maven一些总结

     1.Maven的安装和配置   从Maven的官网上下载Maven的安装包,http://maven.apache.org/download.html.   将其解压在你想安放的目录下.   然后配 ...

  8. 安装配置Vim中文帮助文档

    1.home/.vimrc是用户自己的vim配置文件,在这个配置文件中设置的配置只影响该用安装前的准备工作: 在home目录下列新建文件夹  : .vim ------------------> ...

  9. 洛谷 P1464 Function【动态规划(递推)/记忆化搜索(递归)】

    题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...

  10. Codeforces 731B Coupons and Discounts(贪心)

    题目链接 Coupons and Discounts 逐步贪心即可. 若当前位为奇数则当前位的下一位减一,否则不动. #include <bits/stdc++.h> using name ...