日志

配置

config/config.${env}.js 中配置

exports.logger = {
  dir: '/log/dev',
  encoding: 'gbk',
  outputJSON: true,
};
  • dir 日志文件存放路径
  • encoding 编码方式, 默认 utf-8
  • outputJSON 设置输出格式为JSON,方便日志监控系统分析

框架内置了几种日志,分别在不同的场景下使用:

  • appLogger ${appInfo.name}-web.log,例如 example-app-web.log,应用相关日志,供应用开发者使用的日志。我们在绝大数情况下都在使用它。
  • coreLogger egg-web.log 框架内核、插件日志。
  • errorLogger common-error.log 实际一般不会直接使用它,任何 logger 的 .error() 调用输出的日志都会重定向到这里,重点通过查看此日志定位异常。
  • agentLogger egg-agent.log agent 进程日志,框架和使用到 agent 进程执行任务的插件会打印一些日志到这里。

如果想自定义以上日志文件名称,可以在 config 文件中覆盖默认值:

config/config.${env}.js

module.exports = appInfo => {
  return {
    logger: {
      appLogName: `${appInfo.name}-web.log`,
      coreLogName: 'egg-web.log',
      agentLogName: 'egg-agent.log',
      errorLogName: 'common-error.log',
    },
  };
};

使用

app.js 中打印启动日志

module.exports = app => {
  app.logger.debug('app start');
};

eggTest-web.log 中可以看到输出:

2019-05-27 18:25:06,133 INFO 2124 app start

使用 Context 调用:

ctx.logger.debug('debug info');
ctx.logger.info('some request data: %j', ctx.request.body);
ctx.logger.warn('WARNNING!!!!');
// 错误日志记录,直接会将错误日志完整堆栈信息记录下来,并且输出到 errorLog 中
// 为了保证异常可追踪,必须保证所有抛出的异常都是 Error 类型,因为只有 Error 类型才会带上堆栈信息,定位到问题。
ctx.logger.error(new Error('whoops'));

对于框架和插件开发者会使用到的 App Logger 还有 app.coreLogger

app.js

module.exports = app => {
  app.coreLogger.info('启动耗时 %d ms', Date.now() - start);
};

日志级别

日志分为 NONEDEBUGINFOWARNERROR 5 个级别。

日志打印到文件中的同时,为了方便开发,也会同时打印到终端中。

打印所有级别日志到文件中:

config/config.${env}.js

exports.logger = {
  level: 'DEBUG',
};

关闭所有打印到文件的日志:

config/config.${env}.js

exports.logger = {
  level: 'NONE',
};

为了避免一些插件的调试日志在生产环境打印导致性能问题,生产环境默认禁止打印 DEBUG 级别的日志,如果确实有需求在生产环境打印 DEBUG 日志进行调试,需要打开 allowDebugAtProd 配置项。

config/config.prod.js

exports.logger = {
  level: 'DEBUG',
  allowDebugAtProd: true,
};

终端日志

默认只会输出 INFO 及以上(WARNERROR)的日志到终端中。(注意:这些日志默认只在 local 和 unittest 环境下会打印到终端)

  • logger.consoleLevel: 输出到终端日志的级别,默认为 INFO

可通过如下方式配置输出到终端日志的级别:

打印所有级别日志到终端:

config/config.${env}.js

exports.logger = {
  consoleLevel: 'DEBUG',
};

关闭所有打印到终端的日志:

config/config.${env}.js

exports.logger = {
  consoleLevel: 'NONE',
};

基于性能的考虑,在正式环境下,默认会关闭终端日志输出。如有需要,你可以通过下面的配置开启。(不推荐

config/config.${env}.js

exports.logger = {
  disableConsoleAfterReady: false,
};

日志切割

企业级日志一个最常见的需求之一是对日志进行自动切割,以方便管理。框架对日志切割的支持由 egg-logrotator 插件提供。

按天切割

这是框架的默认日志切割方式,在每日 00:00 按照 .log.YYYY-MM-DD 文件名进行切割。

以 appLog 为例,当前写入的日志为 example-app-web.log,当凌晨 00:00 时,会对日志进行切割,把过去一天的日志按 example-app-web.log.YYYY-MM-DD 的形式切割为单独的文件。

按照文件大小切割

我们也可以按照文件大小进行切割。例如,当文件超过 2G 时进行切割。

例如,我们需要把 egg-web.log 按照大小进行切割:

config/config.${env}.js

const path = require('path');
module.exports = appInfo => {
  return {
    logrotator: {
      filesRotateBySize: [
        path.join(appInfo.root, 'logs', appInfo.name, 'egg-web.log'),
      ],
      maxFileSize: 2 * 1024 * 1024 * 1024,
    },
  };
};

添加到 filesRotateBySize 的日志文件不再按天进行切割。

按照小时切割

我们也可以选择按照小时进行切割,这和默认的按天切割非常类似,只是时间缩短到每小时。

例如,我们需要把 common-error.log 按照小时进行切割:

config/config.${env}.js

const path = require('path');
module.exports = appInfo => {
  return {
    logrotator: {
      filesRotateByHour: [
        path.join(appInfo.root, 'logs', appInfo.name, 'common-error.log'),
      ],
    },
  };
};

添加到 filesRotateByHour 的日志文件不再被按天进行切割。

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress