Nodejs 应用程序的有效日志记录和监控

nodejs 应用程序的有效日志记录和监控

对于任何应用程序,尤其是在生产环境中,监控和日志记录都是关键组件。它们可以深入了解应用程序的运行状况、性能和潜在问题。在 node.js 应用程序中,监控可帮助您跟踪响应时间、内存使用情况、错误率等指标,同时日志记录可捕获有关用户活动、错误和系统性能的基本数据。本文介绍了 node.js 应用程序的有效日志记录和监控技术,以及实际示例和代码片段。

日志记录和监控的重要性在 node.js 中设置日志记录使用 winston 进行灵活的日志记录使用 prometheus 和 grafana 进行监控实施健康检查实际用例:生产中的日志记录和监控

日志记录和监控的重要性

日志记录和监控提供了以下方面的见解:

应用程序运行状况:有关错误、崩溃或严重问题的实时警报。性能指标:有关服务器响应时间、内存使用情况和负载处理的数据。用户活动:跟踪用户请求、成功操作和错误。调试:通过错误日志和跟踪查明问题,更快地进行故障排除。

在 node.js 中设置日志记录

node.js 有一个内置的控制台对象,它提供基本的日志记录功能(console.log()、console.error() 等)。然而,对于可扩展的应用程序,结构化且可配置的日志记录至关重要。

基本日志记录示例:

// basic logging in node.jsconsole.log("application started");console.error("an error occurred");

对于生产级应用程序,请使用结构化记录器,例如 winstonbunyan

使用 winston 进行灵活的日志记录

winston 是 node.js 中流行的日志记录库,它允许配置日志记录级别并支持多种传输(例如文件、控制台、http)。

设置温斯顿:

const winston = require('winston');const logger = winston.createlogger({    level: 'info',    format: winston.format.json(),    transports: [        new winston.transports.console(),        new winston.transports.file({ filename: 'error.log', level: 'error' }),        new winston.transports.file({ filename: 'combined.log' })    ]});// log messageslogger.info("this is an informational message");logger.error("this is an error message");

使用 prometheus 和 grafana 进行监控

prometheus 是一个用于收集应用程序指标的强大工具,grafana 允许您通过详细的仪表板可视化这些指标。

第 1 步:安装 node.js 的 prometheus 客户端

安装舞会客户端包:

npm install prom-client

第 2 步:设置 prometheus 指标

在 node.js 应用程序中定义请求持续时间和活动请求等指标:

const client = require('prom-client');// create metricsconst requestduration = new client.histogram({    name: 'http_request_duration_seconds',    help: 'duration of http requests in seconds',    labelnames: ['method', 'status']});const activerequests = new client.gauge({    name: 'active_requests',    help: 'number of active requests'});// record metricsapp.use((req, res, next) => {    const end = requestduration.starttimer();    activerequests.inc();    res.on('finish', () => {        end({ method: req.method, status: res.statuscode });        activerequests.dec();    });    next();});

第 3 步:公开指标端点

创建端点以向 prometheus 公开指标:

app.get('/metrics', async (req, res) => {    res.set('content-type', client.register.contenttype);    res.send(await client.register.metrics());});

第 4 步:使用 grafana 进行可视化

将 prometheus 连接到 grafana 并创建自定义仪表板以可视化请求率、延迟和内存使用等指标。

实施健康检查

健康检查监视您的应用程序的状态并提醒您可能影响可用性的问题。它们可以包括对服务器响应、内存使用情况或数据库连接的基本检查。

示例:node.js 中的健康检查端点

app.get('/health', (req, res) => {    const healthstatus = {        uptime: process.uptime(),        message: 'ok',        timestamp: date.now()    };    res.status(200).send(healthstatus);});

将运行状况检查与 aws cloudwatchgoogle cloud monitoring 等监控工具集成,以便在出现问题时创建警报。

实际用例:生产中的日志记录和监控

假设您正在 aws 上运行电子商务应用程序,每秒处理数百个请求。以下是如何设置强大的日志记录和监控:

第 1 步:使用 winston 实施日志记录

使用 winston 记录所有关键操作,包括用户请求、成功的交易和错误。

logger.info("User login successful", { userId: "12345", timestamp: new Date() });logger.error("Payment processing failed", { error: error.message, timestamp: new Date() });

第 2 步:设置 prometheus 进行指标收集

使用 prometheus 跟踪请求持续时间、活动请求和内存使用情况等指标。这可以帮助识别高流量期间的性能问题。

第3步:创建用于监控的grafana仪表板

将 prometheus 数据连接到 grafana 并设置仪表板来实时监控响应时间、cpu 使用率和错误率。配置警报以接收任何异常情况的通知,例如错误率激增或内存使用率过高。

结论

有效的日志记录和监控对于管理和扩展 node.js 应用程序至关重要,尤其是在生产环境中。 winston 等日志框架允许您捕获结构化日志,而 prometheus 和 grafana 等监控工具可提供性能指标的可见性并帮助您更快地解决问题。通过实施这些工具,您可以确保 node.js 应用程序平稳运行、高效处理流量并为用户提供可靠的体验。

在下一篇文章中,我们将探讨如何保护 node.js 应用程序,讨论 https、cors、数据加密等技术。请继续关注!

以上就是Nodejs 应用程序的有效日志记录和监控的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1494950.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 17:00:54
下一篇 2025年12月19日 17:01:10

相关推荐

  • 如何使用 JavaScript 定时获取数据库时间并比较,并在当前时间超过数据库时间时执行操作?

    js定时获取数据库时间并比较 需要每隔一段时间从数据库获取时间,并将它与当前时间进行比较。当当前时间大于数据库时间时,执行特定的操作。 解决方案: 创建一个时间比较函数。 立即学习“Java免费学习笔记(深入)”; function comparetimestamps(dbtimestamp, cu…

    2025年12月19日
    000
  • JavaScript 回调函数异步执行问题:如何在 AppFrame.Http.Get 函数执行完毕后才返回?

    javascript 回调函数异步执行问题 在使用 javascript 时,遇到异步问题怎么办?以下是一段代码: var beornoimgto = function(baiduurl) { var du; appframe.http.get(baiduurl, function(ret) { /…

    2025年12月19日
    000
  • 聚集散点图

    使用 zingchart 可视化足球运动员的行走距离 在本教程中,我们将使用 zingchart 创建散点图,以可视化不同足球比赛中球员的移动距离。该图表显示了多场比赛的模拟数据,可以深入了解每分钟所经过的距离。 代码说明 此代码片段使用 javascript 生成八个游戏的虚假数据,然后使用 zi…

    2025年12月19日
    000
  • 安全赋值运算符:try/catch 的替代方案

    注意力 我想指出,安全赋值运算符尚未包含在 ecmascript 标准中。在本文中,我们将探讨如何使用 ecmascript 标准中的安全赋值运算符。 如果你喜欢我的文章,可以请我一杯咖啡:) 在使用 javascript 开发时,特别是在使用异步函数或复杂 api 时,我们使用 try/catch…

    2025年12月19日
    000
  • 如何使用 JavaScript 代码判断字符串是否包含数组元素?

    用更简洁的 js 代码判断字符串包含数组元素 当需要判断一个字符串是否包含某个数组中的任何一个元素时,以上提到的丑陋代码并不优雅。我们可以用更简洁的代码实现这个需求。 数组过滤 我们可以使用数组的 filter() 方法来过滤数组中的元素,并返回一个新数组,其中包含满足给定条件的元素。 立即学习“J…

    2025年12月19日
    000
  • setInterval() 滚动效果不佳:如何解决代码中的速度计算和时间间隔问题?

    setinterval()滚动效果不佳 在尝试使用 setinterval() 函数实现滚动效果时,你遇到了困难,导致效果无法达到预期。为了理解问题所在,让我们回顾一下你的代码和遇到的问题。 代码片段: Oup.onclick = function() { Olist.insertBefore(aI…

    2025年12月19日
    000
  • IndexedDB 解释

    在上一篇文章中,我们讨论了 dexie,indexeddb 的包装器。在本文中,我们讨论 indexeddb。您必须熟悉这个 localstorage api,通常用于在浏览器中存储信息。类似地,indexeddb 用于客户端存储。 什么是 indexeddb? mdn文档说明: indexeddb…

    2025年12月19日
    000
  • Echarts柱状图x轴坐标显示混乱,如何解决?

    echarts数据填充柱状图小技巧 问题:echarts获取后台数据并填充柱状图,但x轴坐标显示混乱,一个字符或符号占据一个坐标格,怀疑转换方式错误。 原因分析: x轴坐标不是字符串,而是经过序列化的json字符串。 解决方案: // 获取后台数据_fys = PUB_PARAMDETAIL.get…

    2025年12月19日
    000
  • JS 回调函数异步执行之谜:为什么函数在异步操作完成之前就返回结果?

    js 回调函数异步执行之谜 在使用 js 回调函数处理异步操作时,有时会遇到函数在异步操作完成之前就返回结果的问题。本文以一个真实的代码示例为例,详细说明了这种情况的成因和解决方案。 示例代码如下: var beornoimgto = function(baiduurl) { var du; app…

    2025年12月19日
    000
  • Axios 已经过时了吗?了解新一代请求工具

    嘿那里!今天我想和大家分享一个非常让我感动的话题——自动重试请求策略。这个功能对我来说绝对是救星!在处理网络请求时,尤其是在不稳定的网络环境中,自动重试策略成为了我值得信赖的伴侣。它使我的应用程序更加强大,并显着改善了用户体验。今天,我很乐意向您介绍 alovajs 中的自动重试请求策略 &#821…

    2025年12月19日
    000
  • 豆瓣电影搜索影院悬浮框自动收起是如何实现的?

    解决豆瓣电影搜索影院悬浮框自动收起问题 在浏览豆瓣电影时,用户可能会遇到这样的情况:点击“影院”后出现搜索框悬浮框,而当点击悬浮框外的区域时,该悬浮框会自动隐藏。本文将探究实现这一效果的方法。 一个可行的解决方案是给 body 绑定一个 click 事件,然后在事件处理程序中检查点击的目标节点是否包…

    2025年12月19日
    000
  • 已上线项目图片懒加载:如何高效添加 data-src 属性?

    为已上线项目的图片添加 data-src,如何优化? 问题: 项目上线后,想要添加图片懒加载功能,如何高效地为页面中现有的图片添加 data-src 属性?一种常见的做法是遍历页面上的所有 img 元素,但这样做效率较低。 解决方案: 为了更有效地添加 data-src 属性,可以使用更巧妙的方法:…

    2025年12月19日
    000
  • 恭喜 Wix Studio 挑战:社区版获胜者!

    等待结束了!是时候宣布 wix studio 挑战赛:社区版的获胜者了。 从国际象棋爱好者和宝石社区到企业家和设计师的专业社区,我们喜欢了解参与者梦想社区平台背后的个性和动机。 感谢 Ania Kubów 承担了为此次挑战选出一位获胜者的艰巨任务。 恭喜… @schemetastic 致力于构建 K…

    2025年12月19日
    000
  • 您的会话已过期!

    好吧,今天我们讨论“会话过期”的概念,特别是当您在项目中使用 nextauth.js 时。用简单、友好的语言来理解,以免产生混乱。 所以,首先让我们了解“您的会话已过期”错误的含义。这是一个 身份验证相关错误,在用户的登录会话终止时出现。例如,您登录了一个网站或应用程序,使用了一段时间,然后离开了一…

    2025年12月19日
    000
  • 动态语言中静态类型的讽刺

    c++kquote>您也可以在 medium 上阅读这篇文章。 当我们看到编程语言如何随着时间的推移而演变时,总是很有趣。 曾几何时,当我开始进入软件开发世界时,python、php 和 javascript 等动态语言因其灵活性和适合快速开发的简洁语法而受到赞赏。 然而,随着这些弱类型语言的…

    2025年12月19日
    000
  • 教育技术平台:尖端的数字大学网站模板

    这是 Wix Studio 挑战赛:社区版的提交内容。 我的社区平台 推出 Edu-Tech 平台 – 一个完全响应式、设计简洁的数字大学模板,专为旨在提供动态学习环境的教育机构量身定制。该模板旨在营造一种社区驱动的氛围,让学生可以学习任何类型的学习计划、获得证书和徽章,并与同龄人和导师…

    2025年12月19日
    000
  • Flexbox下拉框消失问题:如何解决点击分页后下拉框无法收起?

    flexbox下拉框消失问题 在使用flexbox的下拉框组件时,遇到这样的问题:下拉框显示后点击分页,再点击空白区域时,下拉框无法收起。这个问题要如何解决? 以下是提供的代码片段:     ******        —————-function fzflexbox(){   …

    2025年12月19日
    000
  • useReducer 以及它与 useState 的不同之处

    目录 简介何时使用 usestate何时使用 usereducer示例 1:带有 usestate 的计数器应用示例 2:使用 usereducer 的计数器应用示例 3:使用 usereducer 处理表单输入示例 4:使用 usereducer 构建测验应用程序usestate 和 usered…

    2025年12月19日 好文分享
    000
  • 如何用JavaScript正则表达式精准匹配特定class属性的li标签?

    js正则匹配div问题 问题: 如何使用javascript正则表达式匹配以下html中的li标签,该标签具有class属性“n-item n-item-ad spread-item news-item”? @@##@@立即学习“Java免费学习笔记(深入)”;……… 尝试的正则表达式:…

    2025年12月19日
    000
  • 类型实用程序 – JavaScript 挑战

    介绍 检查类型是日常编码和技术面试中 javascript 的常见做法。 您可以在 github 上找到这篇文章中的所有代码。 原始值 在 javascript 中,除 object 之外的所有类型都定义直接在语言最低级别表示的不可变值。我们将这些类型的值称为原始值。 有 7 个原始值: 立即学习“…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信