Hapi 框架中使用 @hapi/good-winston 插件记录 Winston 日志

前言

在 Web 开发中,日志是非常重要的一部分。它可以帮助我们快速定位问题,监控系统运行状况,以及分析用户行为等。在 Node.js 中,Winston 是一个非常流行的日志库,它提供了丰富的功能和灵活的配置,可以满足各种日志需求。而 Hapi 则是一个优秀的 Node.js Web 框架,它提供了丰富的插件和工具,可以帮助我们快速搭建 Web 应用。本文将介绍如何在 Hapi 框架中使用 @hapi/good-winston 插件来记录 Winston 日志。

@hapi/good-winston 插件介绍

@hapi/good-winston 是 Hapi 框架中的一个插件,它可以将 Hapi 应用程序的请求和响应日志输出到 Winston 日志库中。该插件基于 good 插件框架,可以与其他 good 插件一起使用,如 good-console、good-file 等。@hapi/good-winston 插件提供了丰富的配置选项,可以满足各种日志需求。

以下是 @hapi/good-winston 插件的安装命令:

npm install @hapi/good-winston

使用 @hapi/good-winston 插件记录日志

在 Hapi 应用程序中使用 @hapi/good-winston 插件非常简单。我们只需要在创建服务器时,将该插件作为一个日志选项传递进去即可。以下是一个示例代码:

const Hapi = require('@hapi/hapi');
const GoodWinston = require('@hapi/good-winston');
const Winston = require('winston');

// 创建 Winston 日志实例
const logger = Winston.createLogger({
  level: 'info',
  transports: [
    new Winston.transports.Console(),
    new Winston.transports.File({ filename: 'app.log' })
  ]
});

// 创建 Hapi 服务器实例
const server = Hapi.server({
  port: 3000,
  host: 'localhost',
  routes: {
    log: {
      collect: true, // 启用日志收集
      config: {
        // 将 good-winston 插件作为日志选项传递进去
        reporters: {
          winston: [
            {
              module: '@hapi/good-winston',
              args: [{ logger }]
            }
          ]
        }
      }
    }
  }
});

// 添加路由
server.route({
  method: 'GET',
  path: '/',
  handler: (request, h) => {
    logger.info('Hello, world!');
    return 'Hello, world!';
  }
});

// 启动服务器
async function start() {
  await server.start();
  console.log(`Server running at: ${server.info.uri}`);
}

start();

在上面的代码中,我们首先创建了一个 Winston 日志实例,然后创建了一个 Hapi 服务器实例。在创建服务器时,我们将 @hapi/good-winston 插件作为一个日志选项传递进去,并将我们创建的 Winston 日志实例作为参数传递给该插件。最后,我们添加了一个简单的路由,并在该路由中使用我们的 Winston 日志实例记录了一条日志。

配置 @hapi/good-winston 插件

@hapi/good-winston 插件提供了丰富的配置选项,可以满足各种日志需求。以下是 @hapi/good-winston 插件的配置选项:

  • format:日志格式化函数,可以自定义日志格式。
  • levels:日志级别配置,可以自定义日志级别。
  • ops:是否记录 Hapi 应用程序的运行统计信息。
  • request:是否记录请求信息。
  • response:是否记录响应信息。
  • error:是否记录错误信息。
  • log:是否记录 Hapi 应用程序的日志信息。
  • wreck:是否记录 Wreck 库的请求和响应信息。
  • extendedRequests:是否记录扩展的请求信息,如请求耗时、请求体大小等。
  • blacklist:黑名单配置,可以屏蔽一些敏感信息。
  • metadata:元数据配置,可以添加一些自定义元数据。

以下是一个示例代码,展示了如何使用 @hapi/good-winston 插件的配置选项:

const Hapi = require('@hapi/hapi');
const GoodWinston = require('@hapi/good-winston');
const Winston = require('winston');

// 创建 Winston 日志实例
const logger = Winston.createLogger({
  level: 'info',
  transports: [
    new Winston.transports.Console(),
    new Winston.transports.File({ filename: 'app.log' })
  ]
});

// 创建 Hapi 服务器实例
const server = Hapi.server({
  port: 3000,
  host: 'localhost',
  routes: {
    log: {
      collect: true, // 启用日志收集
      config: {
        // 将 good-winston 插件作为日志选项传递进去,并配置插件选项
        reporters: {
          winston: [
            {
              module: '@hapi/good-winston',
              args: [
                {
                  logger,
                  format: 'YYYY-MM-DD HH:mm:ss.SSS',
                  levels: {
                    response: 'info',
                    request: 'info',
                    error: 'error'
                  },
                  ops: {
                    interval: 1000
                  },
                  request: {
                    format: 'method,path,query,statuscode',
                    headers: true,
                    separator: ';'
                  },
                  response: {
                    format: 'statuscode',
                    headers: true,
                    separator: ';'
                  },
                  error: {
                    format: 'stack,trace'
                  },
                  log: '*',
                  extendedRequests: true,
                  blacklist: ['password'],
                  metadata: {
                    app: 'myapp',
                    version: '1.0.0'
                  }
                }
              ]
            }
          ]
        }
      }
    }
  }
});

// 添加路由
server.route({
  method: 'GET',
  path: '/',
  handler: (request, h) => {
    logger.info('Hello, world!');
    return 'Hello, world!';
  }
});

// 启动服务器
async function start() {
  await server.start();
  console.log(`Server running at: ${server.info.uri}`);
}

start();

在上面的代码中,我们在创建服务器时,将 @hapi/good-winston 插件作为一个日志选项传递进去,并配置了插件的各种选项。例如,我们自定义了日志格式、日志级别、运行统计信息、请求信息、响应信息、错误信息、日志信息、扩展请求信息、黑名单、元数据等。这些选项可以根据实际需求进行配置。

总结

本文介绍了如何在 Hapi 框架中使用 @hapi/good-winston 插件来记录 Winston 日志。我们首先介绍了 @hapi/good-winston 插件的安装和使用方法,然后介绍了插件的各种配置选项。通过本文的学习,读者可以了解如何在 Hapi 应用程序中使用 Winston 日志库,并掌握如何使用 @hapi/good-winston 插件来记录日志。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c3100badd4f0e0ffd1ed1c