搜索
首页web前端js教程使用 Lambda 的 Powertools 缓冲日志并在出现错误时自动刷新

Buffer Logs and Flush Automatically on Error with Powertools for Lambda

最新版本的 AWS Powertools for Lambda 让使用自定义功能扩展 Logger 变得更加轻松:

Logger 类现在更具可扩展性
您现在可以覆盖 Logger 方法 createAndPopulateLogItem、printLog 和 processLogItem,这些方法以前是私有的。这允许您扩展记录器并添加新功能,例如实现您自己的消息缓冲区。
发布 v2.12.0

我正在使用这个新的扩展性来实现一个有用的功能:日志缓冲和刷新。这个想法很简单:在生产环境中,我们通常只记录重要信息,例如警告和错误,因为日志空间可能会变得昂贵并且会产生噪音。但是,当发生错误时,我们希望获得所有可能的信息:分散在函数中的所有调试和信息日志都应该可用。但它们并不是因为我们将日志级别设置得太低。

缓冲和冲洗

如果我们在内部收集所有这些调试和信息日志,并且如果发生错误等重要事件,我们将它们打印到控制台怎么办?我把日志分为两类:低级日志和高级日志。如果我们配置的日志级别是 WARN,则 DEBUG 或 INFO 日志将是低级别日志,而 ERROR 将是高级日志。

现在,当我们打印低级日志时,我们不会像现在这样丢弃它,而是将日志缓冲在内部列表中。一旦我们有了高级日志,我们就会将所有缓冲的日志刷新到控制台。

执行

为了添加此功能,我们创建一个新类,该类从 Powertools 扩展 Logger 类并重写 processLogItem()。这是由不同的日志方法(如 logger.debug())调用的中心方法。如果日志项处于正确的级别,原始实现会将日志项打印到控制台。通过重写此方法,我们可以根据日志级别添加缓冲和刷新日志的特殊逻辑。

import { LogItem, Logger as PowertoolsLogger } from '@aws-lambda-powertools/logger';
import type { LogItemExtraInput, LogItemMessage } from '@aws-lambda-powertools/logger/types';

export class Logger extends PowertoolsLogger {
  #buffer: Record<string array string>> = {};

  get buffer(): Record<string array string>> {
    return this.#buffer;
  }

  protected override processLogItem(logLevel: number, input: LogItemMessage, extraInput: LogItemExtraInput): void {
    const xRayTraceId = this['envVarsService'].getXrayTraceId() as string;

    // Flush buffer when log level is higher than the configured log level
    if (logLevel > this.level && xRayTraceId) {
      const buffer = this.#buffer[xRayTraceId] ?? [];

      // Print all log items in the buffer
      if (buffer.length) this.info(`Flushing buffer with ${buffer.length} log items`);

      for (const [bufferLogLevel, bufferLogItem] of buffer) {
        // Create a new LogItem from the stringified log item
        this.printLog(bufferLogLevel, new LogItem(JSON.parse(bufferLogItem)));
      }

      // Clear the buffer after flushing
      // This also removes entries from other X-Ray trace IDs
      this.#buffer = {};
    }

    // Buffer the log item when log level is lower than the configured log level
    if (logLevel 



<p>您可能会问为什么我们在这里使用 X 射线追踪 ID。在处理程序函数之外实例化 Logger 是很常见的。但是,由于 Lambda 执行环境可能会重复用于多次调用,因此缓冲区可能包含先前调用的日志项。这就是缓冲区被实现为对象而不是简单数组的原因。我们使用 X-Ray Trace ID 作为标识符,仅缓冲来自同一调用的日志项。<br>
缓冲区被实现为一个对象而不是一个简单的数组。当缓冲区被刷新时,我们可以简单地重置对象,从而从其他调用中清除项目。</p>
<h2>
  
  
  本地测试
</h2>

<p>让我们快速在本地验证一下实现:<br>
</p>

<pre class="brush:php;toolbar:false">// set X-Ray Trace ID manually if running locally
process.env._X_AMZN_TRACE_ID = '1-abcdef12-3456abcdef123456abcdef12';

// log level = WARN
const logger = new Logger({ logLevel: 'WARN' });

logger.debug('debug'); //  log level

这是我们得到的输出:

import { LogItem, Logger as PowertoolsLogger } from '@aws-lambda-powertools/logger';
import type { LogItemExtraInput, LogItemMessage } from '@aws-lambda-powertools/logger/types';

export class Logger extends PowertoolsLogger {
  #buffer: Record<string array string>> = {};

  get buffer(): Record<string array string>> {
    return this.#buffer;
  }

  protected override processLogItem(logLevel: number, input: LogItemMessage, extraInput: LogItemExtraInput): void {
    const xRayTraceId = this['envVarsService'].getXrayTraceId() as string;

    // Flush buffer when log level is higher than the configured log level
    if (logLevel > this.level && xRayTraceId) {
      const buffer = this.#buffer[xRayTraceId] ?? [];

      // Print all log items in the buffer
      if (buffer.length) this.info(`Flushing buffer with ${buffer.length} log items`);

      for (const [bufferLogLevel, bufferLogItem] of buffer) {
        // Create a new LogItem from the stringified log item
        this.printLog(bufferLogLevel, new LogItem(JSON.parse(bufferLogItem)));
      }

      // Clear the buffer after flushing
      // This also removes entries from other X-Ray trace IDs
      this.#buffer = {};
    }

    // Buffer the log item when log level is lower than the configured log level
    if (logLevel 



<p>警告是第一条消息,因为调试和信息日志已被缓冲。当错误被记录时,我们在实际打印错误之前刷新了缓冲的日志(并打印了信息)。</p>

<h2>
  
  
  征求意见
</h2>

<p>我的幼稚实现有一些警告。最重要的是,缓冲区大小不受限制,这意味着如果缓冲区增长太大,可能会导致内存问题。有几种方法可以缓解此问题,例如,将缓冲区实现为滑动窗口,仅保留最新日志或限制总缓冲区大小。</p>

<p>此外,缓冲日志仅在受控情况下刷新,例如在 logger.error() 上,但在未处理的错误上不会刷新。如果我们将缓冲区公开并使用像 Middy.js 这样的中间件,则可以轻松实现此行为。 Middy 公开了一个 onError 事件,我们可以利用该事件来刷新缓冲区。</p>

<p>我在官方 AWS Powertools for Lambda 存储库的评论请求中更详细地介绍了这一点。</p>

<p>如果您希望看到此功能成为 Powertools for Lambda 的一部分,请在那里分享您的想法和反馈?</p>


          

            
        </string></string>

以上是使用 Lambda 的 Powertools 缓冲日志并在出现错误时自动刷新的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
C和JavaScript:连接解释C和JavaScript:连接解释Apr 23, 2025 am 12:07 AM

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

从网站到应用程序:JavaScript的不同应用从网站到应用程序:JavaScript的不同应用Apr 22, 2025 am 12:02 AM

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python vs. JavaScript:比较用例和应用程序Python vs. JavaScript:比较用例和应用程序Apr 21, 2025 am 12:01 AM

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C/C在JavaScript口译员和编译器中的作用C/C在JavaScript口译员和编译器中的作用Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在行动中:现实世界中的示例和项目JavaScript在行动中:现实世界中的示例和项目Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

了解JavaScript引擎:实施详细信息了解JavaScript引擎:实施详细信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:学习曲线和易用性Python vs. JavaScript:学习曲线和易用性Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版