前端如何进行日志驱动开发

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志在开发过程中的作用自不必说,一旦程序出现问题,我们首先想到的是通过日志监控去追查。好的日志可以通过应用程序执行的历史记录模拟出用户在使用程序的时候操作的完整过程。

日志在开发过程中的作用自不必说,一旦程序出现问题,我们首先想到的是通过日志监控去追查。

好的日志可以通过应用程序执行的历史记录模拟出用户在使用程序的时候操作的完整过程。


想知道发生了什么


为了便于我们分析程序哪里出现问题,我们将采用logrock模块并将其链接到ElasticSearch,LogStash和Kibana进行进一步分析。


LogRock

logrock模块源于研究Cleverbrush时候的创新。它是一个用于处理矢量图形的软件。使用图形编辑器意味着大量的应用程序用例。为了控制成本,不得不优化整个开发测试流程。减少每个环节使用测试用例带来的额外的付出。

该模块可以为您的应用程序组织现代化的日志记录方法。 根据日志,我们测试了我们的应用程序。 在本文中,我将向您介绍如何组织日志系统以搜索错误。


ElasticStack

MBL`[EHO{MS{(6$UEQJI@[T.png

  • ElasticSearch是一个功能强大的全文搜索引擎。
  • LogStash是一个用于从各种来源收集日志的系统,该系统也可以将日志发送到ElasticSearch。
  • Kibana是ElasticSearch的Web界面版,其中包含许多插件。


它是如何工作的

$]%6_~{(MXN$(IRFZATIP98.png

一旦程序出现错误(或者用于特殊模拟),则应用程序会将日志发送到服务器,然后将日志保存到文件中。Logstash将数据增量保存到ElasticSearch数据库。用户登录到Kibana并查看保存的日志。

]%_DT0_H3`YX}SV4X8P1J~E.png

以上就是一个配置好的Kibana的界面,显示了来自ElasticSearch的数据。它可以帮助您分析数据并从中了解程序发生了什么故障。

这里就不一一将如何去设置ElasticStack。


创建日志系统

这里我们将一个日志记录系统集成到基于React开发的单页应用程序中。


Step 1:安装

npm install logrock --save


Step 2:集成到React应用程序中

import { LoggerContainer } from "logrock";
<LoggerContainer>
  <App />
</LoggerContainer>

LoggerContainer是一个捕捉应用程序中的错误并将它们形成堆栈的组件。

堆栈是一个对象,其中包含有关用户的操作系统,浏览器,按下的鼠标或键盘按钮的信息,当然还有操作相关的子数组,其中记录了用户在系统中执行的所有的操作。

LoggerContainer含有配置项,可适当考虑更改其中的一些设置。

<LoggerContainer
  active={true|false}
  limit={20}
  onError={stack => {
    sendToServer(stack);
  }}
>
  <App />
</LoggerContainer>
  • active 开启关闭日志功能
  • limit  设置最近用户操作的最大阙值。如果超过这个值,那么数组中的第一个值将会被删除。数组中始终保持最近的20个操作信息。
  • onError 当错误出发时的一个回调。返回参数stack对象包含环境,用户操作等信息。在回调中我们需要将这些信息上传到ElasticSearch,云端,或者保存到本地文件中,为后面进行数据分析和监控做准备。


打印日志

为了生产高质量的用户操作日志,我们将日志代码覆盖到所有需要打印日志的地方

logrock模块附带一个与 LoggerContainer 连接的记录器。

例如,我们有以下这样一个组件:

import React, { useState } from "react";
export default function Toggle(props) {
  const [toggleState, setToggleState] = useState("off");
  function toggle() {
    setToggleState(toggleState === "off" ? "on" : "off");
  }
  return <div className={`switch ${toggleState}`} onClick={toggle} />;
}

为了能让日志正确覆盖到,我们需要修改toggle方法:

import React, { useState } from "react";
import logger from "logrock";
export default function Toggle(props) {
  const [toggleState, setToggleState] = useState("off");
  function toggle() {
    let state = toggleState === "off" ? "on" : "off";
    logger.info(`React.Toggle|Toggle component changed state ${state}`);
    setToggleState(state);
  }
  return <div className={`switch ${toggleState}`} onClick={toggle} />;
}

我们添加了一个logger方法,其中的信息分为两部分。‘React.Toggle’用于显示该动作发生在React的Toggle组件级别。后面是对该动作和发生所在组件的一些描述信息。日志级别划分不是必须的,但是这样有助于我们快速定位错误发生的有关代码。

我们还可以使用 React 16 中引入的“componentDidCatch”方法来捕获异常。


日志上传

假设我们有一个从后端收集用户数据的方法。该方法是异步的,部分逻辑隐藏在后端中。看看如何将日志添加到代码中?

首先,由于我们有一个客户端应用程序,所有发送到服务器的请求都将在一个用户会话内传递,而无需重新加载页面。 为了将客户端上的操作与服务器上的操作相关联,我们必须创建一个全局SessionID并将其添加到针对服务器的每个请求头的标记中。 在服务器上,我们可以使用任何记录器来记录我们的逻辑,如前端示例所示,如果发生错误,请将带有附加sessionID的数据发送到ElasticSearch,发送到后端。


Step 1:客户端生成SessionID

window.SESSION_ID = `sessionid-${Math.random().toString(36).substr(3, 9)}`;


Step 2:封装请求

我们需要将SessionID添加到请求头中。如果我们使用以及封装好的请求库,很容易将声明好的SessionID添加到所有的请求中。

let fetch = axios.create({...});
fetch.defaults.headers.common.sessionId = window.SESSION_ID;


Step 3:将SessionID和日志堆栈绑定

LoggerContainer有专门的sessionID字段

<LoggerContainer
  active={true | false}
  sessionID={window.SESSION_ID}
  limit={20}
  onError={stack => {
    sendToServer(stack);
  }}
>
  <App />
</LoggerContainer>


Step 4:请求后端接口

前端请求类似下面:

logger.info(`store.getData|User is ready for loading... User ID is ${id}`);
getData('/api/v1/user', { id })
  .then(userData => {
    logger.info(`store.getData|User have already loaded. User count is ${JSON.stringify(userData)}`);
  })
  .catch(err => {
    logger.error(`store.getData|User loaded fail ${err.message}`);
  });

它是怎么运行的呢?

我们在客户端请求之前写一个日志。 从我们的代码中,我们可以看到现在开始从服务器下载数据。 我们已将SessionID附加到请求。 如果我们的后端日志包含此SessionID的添加而请求失败,那么我们可以看到后端发生了什么。

因此,我们不仅在客户端而且还在服务器上监视应用程序的整个周期。


用户交互

有些日志对用户是有帮助的。向用户输出必要的信息可以采用 stdout 方法

<LoggerContainer
  active={true | false}
  limit={20}
  bsodActive={true}
  bsod={BSOD}
  onError={stack => {
    sendToServer(stack);
  }}
  stdout={(level, message, important) => {
    console[level](message);
    if (important) {
      alert(message);
    }
  }}
>
  <App />
</LoggerContainer>
  • stdout 方法用于打印提示信息到页面中

我们通过logger传递的第二个参数的值为true来声明这是一个重要的信息,需要通过pop-up窗口显示给用户看,比如在数据加载的时候失败了,我们将输出以下错误信息:

logger.log('Something was wrong', true);


一些注意项

  • 日志监控(包括生产环境),因为测试人员永远无法覆盖所有的测试用例,完全模拟到用户操作
  • 不要忘记在许可协议中提及日志收集。
  • 不要在日志中记录用户密码,银行详情地址等敏感的个人信息。
  • 避免在日志中添加冗余信息,尽量保证简洁有用


总结

当我们完成编码对外发布应用程序的时候,如果把程序比作一个生命,那么这个生命才刚刚开始。收集并监视日志可以获得产品的反馈帮助更好的改善。




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
71 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
14天前
|
监控 开发者
鸿蒙5.0版开发:使用HiLog打印日志(ArkTS)
在HarmonyOS 5.0中,HiLog是系统提供的日志系统,支持DEBUG、INFO、WARN、ERROR、FATAL五种日志级别。本文介绍如何在ArkTS中使用HiLog打印日志,并提供示例代码。通过合理使用HiLog,开发者可以更好地调试和监控应用。
57 16
|
17天前
|
前端开发 JavaScript 安全
揭秘!前端大牛们如何高效解决跨域问题,提升开发效率!
【10月更文挑战第30天】在Web开发中,跨域问题是一大挑战。本文介绍前端大牛们常用的跨域解决方案,包括JSONP、CORS、postMessage和Nginx/Node.js代理,对比它们的优缺点,帮助初学者提升开发效率。
38 4
|
1月前
|
负载均衡 前端开发 JavaScript
前端研发链路之开发
本文首发于微信公众号“前端徐徐”,作者徐徐。文章介绍了前端研发链路中的开发部分,重点探讨了开发服务器(dev-server)、热更新(hot-reload)、数据模拟(mock)和代理(proxy)等关键技术,帮助开发者理解其基本原理和应用场景,提升开发效率和代码质量。
36 2
前端研发链路之开发
|
1月前
|
人工智能 前端开发 测试技术
探索前端与 AI 的结合:如何用 GPT-4 助力开发效率
本文介绍了 GPT-4 如何成为前端开发者的“神队友”,让开发变得更加高效愉快。无论是需求到代码的自动生成、快速调试和性能优化,还是自动化测试和技术选型,GPT-4 都能提供极大的帮助。通过智能生成代码、捕捉 BUG、优化性能、自动化测试生成以及技术支持,GPT-4 成为开发者不可或缺的工具,帮助他们从繁重的手动任务中解脱出来,专注于创新和创意。GPT-4 正在彻底改变开发流程,让开发者从“辛苦码农”转变为“效率王者”。
33 0
探索前端与 AI 的结合:如何用 GPT-4 助力开发效率
|
1月前
|
前端开发 JavaScript 开发者
前端angularJs的开发过程
前端angularJs的开发过程
19 1
|
1月前
|
开发框架 缓存 安全
开发日志:IIS安全配置
开发日志:IIS安全配置
开发日志:IIS安全配置
|
1月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
39 1
|
2月前
|
前端开发 开发者 UED
前端只是切图仔?来学学给开发人看的UI设计
该文章针对前端开发者介绍了UI设计的基本原则与实践技巧,覆盖了布局、色彩理论、字体选择等方面的知识,并提供了设计工具和资源推荐,帮助开发者提升产品的视觉与交互体验。
|
1月前
|
JavaScript 前端开发 应用服务中间件
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
27 0