返回

Egg.js中自定义请求级别日志,满足统一日志管理规范

前端

在统一日志管理规范中,请求级别的日志需要包含特定的字段,比如请求时间、请求方法、请求路径、请求参数、请求头等信息。这些信息对于追踪和分析系统问题至关重要。

而Egg.js默认的请求日志格式并不能满足这些需求,因此我们需要对其进行自定义。

Egg.js提供了一种方便的方法来自定义日志格式,可以通过在配置文件中配置logger选项来实现。

logger: {
  // 设置日志输出到文件
  consoleLevel: 'INFO',
  file: true,
  // 设置日志输出路径
  dir: 'logs',
  // 自定义日志格式
  formatter: async (ctx) => {
    const ip = ctx.get('x-real-ip') || ctx.ip;
    const method = ctx.method;
    const url = ctx.url;
    const status = ctx.status;
    const elapsed = Date.now() - ctx.start;
    // 自定义日志格式,包含请求的相关信息
    return `${ip} - ${method} ${url} - ${status} - ${elapsed}ms`;
  }
}

通过上面的配置,我们可以将日志输出到文件,并自定义日志格式。日志中包含了请求的IP地址、请求方法、请求路径、请求状态和请求耗时等信息。

自定义的日志格式需要满足统一日志管理规范的要求,这样才能实现集中收集和分析日志的目的。

除了自定义日志格式之外,我们还可以通过Egg.js的logger中间件来记录更多的日志信息,比如请求参数、请求头等。

const logger = require('egg-logger').logger;

// 自定义日志中间件
module.exports = () => {
  return async function loggerMiddleware(ctx, next) {
    // 记录请求开始时间
    ctx.start = Date.now();
    // 调用下一个中间件
    await next();
    // 记录请求结束时间
    ctx.end = Date.now();
    // 记录请求相关信息
    const ip = ctx.get('x-real-ip') || ctx.ip;
    const method = ctx.method;
    const url = ctx.url;
    const status = ctx.status;
    const elapsed = ctx.end - ctx.start;
    const requestParams = ctx.request.body;
    const requestHeaders = ctx.request.headers;
    // 使用logger记录日志
    logger.info(`[${ip}] - [${method}] - [${url}] - [${status}] - [${elapsed}ms] - [${JSON.stringify(requestParams)}] - [${JSON.stringify(requestHeaders)}]`);
  };
};

通过自定义日志中间件,我们可以记录更多与请求相关的日志信息,便于系统问题的追踪和分析。

自定义请求级别的日志,可以让日志管理系统收集和分析更全面的日志信息,从而为运维和开发人员提供更好的决策支持。