日志是对系统进行有效的监控,在后期问题排查、功能改进、优化都起到非常大的作用,egg框架中提供了一套日志记录的解决方案。

egg 日志使用方法

1.定义日志配置参数,egg定义了一套默认配置参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//文件地址:egg/lib/core/config.default.js
exports.logger = {
dir: path.join(antx['app.root'], 'logs', antx['app.name']),
encoding: 'utf8',
env: antx.env, //环境,如env,pro,test
level: 'INFO', //日志输出的级别
consoleLevel: 'INFO', //console通道的输出级别
outputJSON: false, //是否输出到json文件中
buffer: true, // 输出到文件时是否启用缓冲
appLogName: `${antx['app.name']}-web.log`, //worker进程下的app日志文件名
coreLogName: 'egg-web.log', //worker进程的coreLog日志文件名
agentLogName: 'egg-agent.log', //agent的日志文件名
errorLogName: 'common-error.log', //错误日志文件名
coreLogger: { //针对coreLogger分类定义特殊的分类,其它分类也是相同处理,如errorLog,agentLog
level: 'ERROR'
},
};

2.我们也可以在应用的配置文件下对默认配置进行修改。egg的配置文件加载是通过Loader机制完成的,应用、插件、框架都可以定义日志配置,只要保证目录结构和文件名是一致,但存在优先级(应用 > 框架 > 插件)。
3.可以为不同类别的日志定义不同的参数,如写到不同的文件、日志级别、输出文件地址等,以上代码14行就是针对coreLogger的配置。
4.egg日志写入方法

  1. 错误日志都会统一写到common-error.log中,在agent或worker错误级别的日志也会redirect到此文件中。
  2. 在agent或worker进程中通过以下方式写入日志:
    • this.logger.info(‘开始调用接口’) //写到logger中
    • this.coreLogger.info(‘开始调用接口’) //写到coreLogger中
    • this.errorLogger.error(‘调用接口出错’) //注意这里只能记录错误的日志,其它日志都不会输出到通道中。可以通过this.logger.error(‘调用接口出错’) 代替这种写法

日志的启动过程

loggerstartup.jpg

可以从图中看到日志是在Application类中创建的,worker进程和agent进程都会new Application类。

日志模块类图

classuml.jpg
类介绍:

  • Loggers:日志管理类,根据当前进程(worker或agent)和不同的配置创建errorLogger,logger,coreLogger和customeLogger。
  • Logger:日志处理基类,处理日志的输出操作,支持输出到三种通道中,分别是console、File、JSON File。
  • Transport:日志的输出通道基类,派生出文件通道与终端通道。FileBufferTransport是针对文件通道做了文件输出缓冲机制,以免每次都调用硬盘进行写操作,控制一定的时间,把数据集中在一起,统一写入。

错误日志
输出日志文件名为:common-error.log,对应的配置节点是errorLogName,记录系统错误日志,文件包括以下几种错误日志:

  • master,agent,worker进程中未被用户手动处理的错误
    • agent进程:process.on(‘oncaughtException’,this._uncaughtExceptionHandler)处理捕获到的错误并通过this.coreLogger.error(err)输出到错误日志中。代码在egg/core/agent.js中。
    • work进程:由模块on-error完成,app.on(‘error’)会监测此进程的错误并把日志输出到错误日志中。代码在on-error/app.js中。
  • 三个进程中调用logger.error或coreLogger.error输出的日志

agent进程日志
记录agent进程中的日志,在agent进程中通过this.logger或this.coreLogger都会输出在agentLogName配置的文件名中。

worker进程日志

  • this.logger输出的日志是在appLogName配置的文件名中。
  • this.coreLogger输出的日志是在coreLogName配置的文件名。

记录日志的方法

  1. 业务异常
  2. 对外部api的调用
  3. 非预期的执行
  4. 系统的出入口
  5. 状态的变化

相关参考文章

  1. egg
  2. 日志记录的作用和方法
  3. RFC5424定义的日志规范