已经很久没有学习了,趁需求不饱和,想通过学习组里的成熟的node系统,模仿搭建一个“健全”的node系统。

一般第一步肯定是怎么配置基础信息,让这个系统跑起来。可是。。。刚好我不会日志管理,想研究下怎么打logger,所以。。第一篇我就来写,这个系统的日志管理怎么做。我用的node框架是express,日志管理工具是log4js。

什么时候什么信息需要打日志?

我总结了下几个可能需要打日志的信息,可根据实际情况增删
1、前端的请求。(为了方便排查问题)
2、返回的响应。
3、系统间的交互行为。一个成熟的项目,应该不会只有一个node系统。我觉得node更多充当一个中间层,如果node能处理的问题可以node处理不麻烦java童鞋,但一些不适合node处理比如CPU密集型或逻辑复杂的肯定交给java童鞋处理会比较好。虽然多了一次http请求,但是这些时间其实是可以忽略不计的。所以在node调用各个系统接口什时,我觉得还是有必要打印body和response。除了利于排查问题外,还能关键时候不背锅。
3、其他的手动logger。

怎么用?

1、一个req请求贯穿整个请求了。前端的请求和返回的响应都跟req请求相关,如果把这个log4js挂载在req上,那么我们使用起来就很方便了。express的中间件可以帮我们实现这个功能。使用方式:req.logger.info(msg)
2、至于node系统与其他java系统交互。一个成熟的系统,肯定会把这个请求交互封装成一个class,所以只要我们在这个class的request方法打logger,就可以实现一个地方写,每个请求都自动打logger,对使用者来说无感且方便。

logger的分类

log4js支持ALLTRACEDEBUGINFOWARNERRORFATALOFF8种,但一般使用info和error两种。
虽然同一个文件可以存不同类型的日志,但把info类型和error类型分开两个文件存,有几个好处:
1、可以对error的日志类型进行监控,及时报警
2、存储的时间可以有所不同,info类型存近15天,error类型存近1个月。
3、如果node系统与多个系统都有交互,比如A系统是跟账号相关的功能、B系统与文章相关的功能、C系统与商品相关的功能等等,这时候也可以根据系统对日志进行分类:A系统的日志在一个文件夹,B系统的日志一个文件夹。而且根据日志量,分不同的年月日时分来存。
把日志分类,都是为了利于排查问题!
日志文件是以下的结构:

systemA--error--2018-09-26.log--info--2018-09-26.log
systemB--error--2018-09-26.log--info--2018-09-26-17.log--2018-09-26-18.log

实现

说了这么多,马上来实现了
先把log4js配置好

//simpleType.js  这个js定义了有哪几个系统类型(就是有哪些文件夹)
module.exports = ['systemA','systemB','systemC','systemD'
]
//logger.js  这个js初始化了配置并初始化
const path = require('path')
const fs = require('fs')
const log4js = require('log4js')
const category = require('./simpleTypes')let logger_conf = {appenders: {console: {type: 'console'}},replaceConsole: true,//控制台日志categories: {default: {appenders: ['console'],level: 'info'}}
}const DEFAULT_PATTERN = 'yyyy-MM-dd-hh.log'if(process.env.UAE_MODE) {  //生产环境才有日志文件category.forEach(c => {let dirPath = path.join(__dirname, `../logs/${c}`)if(!fs.existsSync(dirPath)) fs.mkdirSync(dirPath);let infoPath = path.join(dirPath, 'info/');let errorPath = path.join(dirPath, 'error/');['Info', 'Error'].forEach(type => {  //其实这里的配置我觉得有点毛病,请大神指出logger_conf.appenders[`${c}${type}`] = {type: 'dateFile',pattern: DEFAULT_PATTERN,filename: infoPath,alwaysIncludePattern: true,category: `${c}${type}`}logger_conf.categories[`${c}${type}`] = {appenders: [`${c}${type}`, 'console'],level: type.toLowerCase()}})})
}
if(logger_conf.appenders) {for(var key in logger_conf.appenders) {if(logger_conf.appenders[key].filename)checkFile(logger_conf.appenders[key].filename) //一定存在文件夹,不然会出错}
}
log4js.configure(logger_conf)function checkFile(dir) {if(!fs.existsSync(dir)){fs.mkdirSync(dir);}
}
module.exports = log4js;  //对外暴露一个log4js实例

配置好,那就是使用了
首先是req的挂载。使用方式:req.systemAInfo.info('req logger msg')

//middleware/logger.js  middleware文件夹专门存放中间件,后续文章会讲
const log4js = require('../logger/logger')
const simpleTypes = require('../logger/simpleTypes')module.exports = function(req) {simpleTypes.forEach(system => {['Info', 'Error'].forEach(type => {var log = `${system}${type}`req[log] = log4js.getLogger(log)})})
}//index.js
app.use('*', function(req, res, next) {reqLogger(req)   //通过express的中间件对req挂载next()
})

至于系统层级的,每个系统的class都继承一个Base class,在Base class里实现

// Base.js
const request = require('request')
const log4js = require('../logger/logger')module.exports = class Base {constructor(id) {this.id = id;}request(opts, cb) {let infoLogger = log4js.getLogger(`${this.id}Info`)let errorLogger = log4js.getLogger(`${this.id}Error`)opts = this._requestFilter(opts)//  各个系统鉴权let body = JSON.stringify(opts)infoLogger.info(body)request(opts, (err, res, body) => {if(err) errorLogger.error(JSON.stringify(err))else if(body && body.error) errorLogger.error(JSON.stringify(body.error))else{infoLogger.info(JSON.stringify(body))cb(err, body)}    })}_requestFilter(opts) {return JSON.parse(JSON.stringify(opts))}
}//systemA.js
const Base = require('./Base')
class systemA extends Base {constructor() {super('systemA')}_requestFilter() {//systemA的鉴权,后面文章   }
}
mudole.exports = systemA

好了,一个日志管理就初成型了

一个node系统的日志管理相关推荐

  1. Linux系统的日志管理

    Linux系统的日志管理 一.systemd-journald服务 1.systemd-journald介绍 2.系统日志默认保存路径 3.systemd-journald的配置文件修改 ①配置文件目 ...

  2. 一个好用的日志管理工具类MyLogger

    日志的规范管理,在项目中不容忽视,应用上线后将调试日志关闭也是十分必要的,下面就是一个好用的日志管理工具类(点击下载): import java.util.Hashtable;import andro ...

  3. 网络溯源追踪系统的日志管理与运行维护?

    日志管理提供对日志信息的集中管理功能,收集内外网分布式环境下各分系统软硬件日志,对收集到的日志信息根据严重程度.影响的范围.事件类型.数量等进行有效的存储.存取.查询.检索和统计,实现操作溯源和操作审 ...

  4. Linux系统的日志管理及时间管理

    目录 实验环境 1. journald 1.1 journalctl概述 1.2 查看系统日志 1.3 用journald服务永久存放日志 2. rsyslog 2.1 rsyslog概述 2.2 自 ...

  5. Linux 系统的日志管理

    ############################### #    实验环境          # ############################### localhost1: 172 ...

  6. 利用Spring的aop原理实现系统级日志管理 附带源码

    1.声明系统日志切面类并交给Spring容器管理 代码如下: @Aspect @Component public class SysLogAspect {@Autowiredprivate SysLo ...

  7. Linux红帽8.2系统中密钥加装和日志管理

    实验环境的搭建:服务器和客户端,共要两台虚拟机,删除原有的网卡配置,新建网卡设置. 服务器和客户端都这样进行设置: hostnamectl set-hostname westosbbb.westos. ...

  8. 浪潮服务器系统下收集日志,浪潮:打卡了解Venus 详解这款OpenStack日志管理项目...

    (全球TMT2021年5月24日讯)Venus是什么?初见还要追溯到去年11月召开的浪潮云海创新论坛2020.会上不仅分享了浪潮云海对于前沿科技的创新洞见以及扎实可靠的落地实践,更重要的是TA,一个开 ...

  9. 【笔记】最佳日志管理工具:51个有用的日志管理、监视、分析等工具

    最佳日志管理工具:51个有用的日志管理.监视.分析等工具 痛苦的纯文本日志管理日子一去不复返了.虽然纯文本数据在某些情况下仍然很有用,但是在进行扩展分析以收集有洞察力的基础设施数据并改进代码质量时,寻 ...

最新文章

  1. Python 调用matplotlib模块绘制柱状图
  2. [COCI2015]COCI
  3. php 替换 乱码,php文字替换出现乱码
  4. TCP/IP总结(4)TCP 概述
  5. SQLite.NET在Win7(64位)下使用的问题
  6. 如何实现一个java窗口_如何实现多个弹出窗口?
  7. 图像直方图原理与Python实现
  8. python中delete怎么用_python删除np.deletePython基础教程05 - 缩进和选择
  9. 数据结构与算法(一):线性表、栈、树(二叉树,AVL树)、图
  10. python实现堆排序用类的方法_三分钟玩转堆排序原理及面试题(多图解释 + Python 实现)...
  11. pandas nat_利用pandas爬取研招网信息
  12. 第 13 章 装饰模式【Decorator Pattern】
  13. 快手sig签名和did egid的注册(操作太快了,请稍微休息一下)
  14. jquery仿钉钉流程图制作。
  15. UEBA 的当下与未来
  16. 巨控GRM110无线通信模块
  17. VTK实现电影级渲染效果(CVR)
  18. 视频教程-软考系统集成项目管理工程师视频教程(中)-软考
  19. 海龟绘图turtle模块
  20. donet datatable的代码输入

热门文章

  1. mysql sql语句集合
  2. linux系统上安装远程软件下载,如何安装向日葵远程控制软件Linux被控端?
  3. 真深复制python_Python深复制浅复制or深拷贝浅拷贝
  4. python 通用数据库类型_Python开发基础之Python常用的数据类型
  5. android 4g获取mac地址,Android手机获取Mac地址的几种方法
  6. 纯命令行linux环境,Ubuntu Server纯命令行环境安装 Dropbox
  7. 向android获取文件路径,在Android上获取图像的文件路径
  8. android markdown 框架,Android Studio MarkDown风格README的正确打开姿势
  9. linux下asm磁盘查看,ASM磁盘空间的查看
  10. ue4蓝图运行顺序_学习UE4,先学蓝图还是c++_资源库