一、创作背景

在上一篇博客中,我分享了在原生鸿蒙中,进行RN的热加载,以达到修改RN代码后不需要重新打包,即可实时调试的效果。

本次我将分享一下RN的日志系统,以及对js中线上bug的监听,希望能对大家有所帮助。

二、多种多样的日志查看方式

1、系统自带logbox错误日志

集成系统自带logbox:

如果您使用的是RNApp启动的RN框架,那么这一步可以跳过。

如果您使用的是RNSurface启动的RN框架,您就需要创建一个RNComponentContext并创建LogBox的构造器,并在context的devToolsController中增加如下的事件监听,并进行对应的启动和关闭LogBox弹窗的操作:

this.logBoxDialogController = new CustomDialogController({
cornerRadius: 0,
customStyle: true,
alignment: DialogAlignment.TopStart,
backgroundColor: Color.Transparent,
builder: LogBoxDialog({
ctx: RNComponentContext,
rnInstance: this.rnInstance,
initialProps: this.initialProps,
buildCustomComponent: this.buildCustomComponent,
})
})
···
this.rnInstance.getTurboModule<LogBoxTurboModule>(LogBoxTurboModule.NAME).eventEmitter.subscribe("SHOW", () => {
this.logBoxDialogController.open();
})
this.rnInstance.getTurboModule<LogBoxTurboModule>(LogBoxTurboModule.NAME).eventEmitter.subscribe("HIDE", () => {
this.logBoxDialogController.close();
})

下图为logbox示意图,展示了错误的说明、源码以及调用栈信息:

2、命令行日志

当JS代码中有报错时,会直接在跑RN服务端的命令行中出现报错日志

3、控制台日志

当我们使用console.log()的方式进行日志输出时,可以在多个地方看到这个日志结果。比如我这里在代码中,使用console.log("1111")尝试输出1111:

devstudio中可看到:

命令行中亦可看到

chrome devtools是RN中的Debug工具,具体使用我会在下一篇中进行分享,里面也可看到:

控制台日志的类型

控制台日志有3种类型,分别是console.log()、console.warn()、throw关键字。我这里分别对这3种日志进行输出,来看看这些日志可以在哪里查看:

在命令行这边的表现:

flipper这边的表现:

直接体现在APP界面内

如果是warn级别的日志,会直接在APP底部弹出:

如果是throw一个error,则手机上的页面会被满屏的错误日志覆盖:

这里有一个好用的小技巧,点击每一行的提示,可以在你的电脑上大屏查看更详细的堆栈信息。

最后解释一下底部这2个按钮的作用,dismiss代表关闭弹窗,minimize代表最小化弹窗,后面还可以再次进入这个错误弹窗查看里面的堆栈信息。

4、flipper日志

flipper是用来debug应用的工具,具体使用我会在下一篇博客中详细分享,flipper的日志是在控制台选项卡中:

三、对RN中的报错进行线上监听

1、try...catch

可以使用try...catch进行错误监听,这个不用多说,不过前提是你得知道它发生的地方在哪里。所以这个其实不是很实用,一般就是用来监听某个危险代码段。

2、react-native-exception-handler

要集成这个错误监听,第一步当然是npm install了

npm install @react-native-oh-tpl/react-native-exception-handler

在之前的安卓和IOS开发中,下载完RN的三方依赖包以后只需要npm link以下就可以了,原生项目中不需要任何的配置和代码的修改。但是在鸿蒙中npm link不行,需要手动去link。

第二步是在项目最外层的oh-package.json5中指定oh包路径:

加完了以后同步一下:

同步以后,package.json里面就自动有了这个依赖:

第三步是在模块的oh-package.json5中指定react-native-exception-handler的具体目录:

加上这行以后,如果你发现底部有红线报错了,说明这个路径是错的,看看你node_module相对于这个entry\oh-package.json5文件的正确路径即可。

react-native-exception-hander的使用

使用方式和在安卓中是一样的,可以监听JS错误和原生错误,根据项目的实际需求去选择。

监听js的写法:

import {setJSExceptionHandler, getJSExceptionHandler} from 'react-native-exception-handler';

// 大多数应用场景:
// 注册错误处理器(也许可以在index.android.js或index.ios.js中执行)
setJSExceptionHandler((error, isFatal) => {
// 这是您的自定义全局错误处理器
// 可以显示错误对话框或触达Google Analytics跟踪崩溃
// 或在关闭应用前触达自定义API告知开发团队。
}); // 高级用例:
const exceptionHandler = (error, isFatal) => {
// 您的错误处理器函数
};
setJSExceptionHandler(exceptionHandler, allowInDevMode);
// - exceptionHandler 是错误处理器函数
// - allowInDevMode 是一个可选参数,布尔值。
// 如果设为true,则在开发模式下也会调用此处理器代替红屏。 // getJSExceptionHandler 返回当前设置的JS异常处理器
const currentHandler = getJSExceptionHandler();

监听原生的写法:

import { setNativeExceptionHandler } from "react-native-exception-handler";

// 大多数应用场景:
setNativeExceptionHandler((exceptionString) => {
// 这是您的自定义全局错误处理器
// 可以触达Google Analytics跟踪崩溃
// 注意:在原生错误的情况下,使用JS显示警告或任何UI变化是不可行的。
}); // 高级用例:
const nativeExceptionHandler = (exceptionString) => {
// 您的异常处理器代码
};
setNativeExceptionHandler(
nativeExceptionHandler,
forceAppQuit,
executeDefaultHandler
);
// - nativeExceptionHandler 是异常处理器函数
// - forceAppQuit 是特定于Android的可选参数,定义是否在发生错误时强制退出应用,默认为true。
// - executeDefaultHandler 是适用于iOS和Android的可选布尔参数,
// 它会执行先前由其他模块设置的异常处理器,如果您使用任何其他崩溃分析模块与此模块一起使用时非常有用。
// 默认值为false。如果与其他分析模块一起使用,请设为true。

如果还有其他定制的需求,可以访问react-native-exception-handler的仓库查看。

四、本文总结

在本文中,我分享原生鸿蒙中RN的日志类型以及使用方式。并且给出了线上错误日志监听方式的集成和使用。

大致上来说,在原生鸿蒙中的RN日志系统和原生安卓中的RN日志系统是很类似的,不管是写法上,还是用法上来说。不同的地方是如果要继承react-native-exception-handler库的话,鸿蒙RN里目前不支持自动Link,可能要稍微麻烦一些。

在下一篇中,我将分享鸿蒙RN中的断点Debug用法,感兴趣的家人们可以点赞关注支持一下,方便后续第一时间能查看到我最新的分享。

原生鸿蒙中的RN日志系统的更多相关文章

  1. C++日志系统log4cxx使用总结

    原文地址:C++日志系统log4cxx使用总结作者:邵明 本文主要从log4cxx级别.layout.格式化.命名规则.Filter几个方面介绍.   一.log4cxx命名规则         Lo ...

  2. 6 个 K8s 日志系统建设中的典型问题,你遇到过几个?

    作者 |  元乙  阿里云日志服务数据采集客户端负责人,目前采集客户端 logtail 在集团百万规模部署,每天采集上万应用数 PB 数据,经历多次双 11.双 12 考验. 导读:随着 K8s 不断 ...

  3. 使用日志系统graylog获取Ceph集群状态

    前言 在看集群的配置文件的时候看到ceph里面有一个graylog的输出选择,目前看到的是可以收集mon日志和clog,osd单个的日志没有看到,Elasticsearch有整套的日志收集系统,可以很 ...

  4. 云原生系列5 容器化日志之EFK

    上图是EFK架构图,k8s环境下常见的日志采集方式. 日志需求 1 集中采集微服务的日志,可以根据请求id追踪到完整的日志: 2 统计请求接口的耗时,超出最长响应时间的,需要做报警,并针对性的进行调优 ...

  5. Loki日志系统

    一.概述 背景 Loki的第一个稳定版本于2019年11月19日发布,是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统. Grafana 对 Loki ...

  6. 搭建Loki、Promtail、Grafana轻量级日志系统(centos7)

    搭建Loki.Promtail.Grafana轻量级日志系统(centos7)--简称PLG 需求 公司项目采用微服务的架构,服务很多,每个服务都有自己的日志,分别存放在不同的服务器上.当查找日志时需 ...

  7. Loki日志系统基础知识

    文章摘抄转载自:https://lluozh.blog.csdn.net/article/details/111027998 Loki 日志系统由以下3个部分组成: loki是主服务器,负责存储日志和 ...

  8. 引擎之旅 Chapter.4 日志系统

    关于近段时间为何没有更新的解释:Find a new job. 目录 引言 日志语句的分类 控制台窗体 和 VSOutput Tab的日志打印 存储至特定的文件中 展示堆栈信息 引言 一般来说,一个优 ...

  9. C++ 高性能无锁日志系统

    服务器编程中,日志系统需要满足几个条件 .高效,日志系统不应占用太多资源 .简洁,为了一个简单的日志功能引入大量第三方代码未必值得 .线程安全,服务器中各个线程都能同时写出日志 .轮替,服务器不出故障 ...

  10. Atitit.日志系统slf4j的使用

    Atitit.日志系统slf4j的使用 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar ...

随机推荐

  1. 【音视频通话】使用asp.net core 8+vue3 实现高效音视频通话

    引言 在三年前,写智能小车的时候,当时小车上有一个摄像头需要采集,实现推拉流的操作,技术选型当时第一版用的是nginx的rtmp的推拉流,服务器的配置环境是centos,2H4G3M的一个配置,ngi ...

  2. Kubernetes-3.2:kubespray安装高可用k8sv1.20.2集群及常见报错解决

    kubespray安装高可用k8s集群 环境介绍 系统环境 主机名 / IP地址 角色 内核版本 CentOS 7.6.1810 master1 / 192.168.181.252 master &a ...

  3. SimpleTranslationAIAgent:基于C#与LLM的翻译AI Agent

    基于C#与LLM通过简单对话即可实现文件到文件的翻译任务 该软件是MIT协议完全开源免费的,但是调用LLM的API可能需要费用,但是没关系,赛博菩萨硅基流动与智谱AI等都有免费的模型可调了. 这个Tr ...

  4. C#自定义控件—旋转按钮

    C#用户控件之旋转按钮 按钮功能:手自动旋转,标签文本显示.点击二次弹框确认(源码在最后边): [制作方法] 用方法找到控件的中心坐标,画背景外环.内圆:再绘制矩形开关,进行角度旋转即可获得: [关键 ...

  5. iPay88 学习笔记

    ipay88 学习笔记 之前弄过 MOLPay 现在弄 ipay88</p><p>差不多的概念 这里记入流程就好了 首先是做订单, 然后通过 merchant key + 订单 ...

  6. DLA:动态层级注意力架构,实现特征图的持续动态刷新与交互 | IJCAI'24

    论文深入探讨了层级注意力与一般注意力机制之间的区别,并指出现有的层级注意力方法是在静态特征图上实现层间交互的.这些静态层级注意力方法限制了层间上下文特征提取的能力.为了恢复注意力机制的动态上下文表示能 ...

  7. MyBatis——案例——查询-多条件查询(多参数接收的三种方法)

    查询-多条件查询   编写接口方法:Mapper接口       参数:所有条件查询 List<Brand> selectByCondition(int status,String com ...

  8. .NET 8 + Vue/UniApp 高性能前后端分离框架

    前言 作为一名开发者,我们知道能够简化开发流程.提升工作效率的工具是至关重要的. 推荐一款前后端分离框架 Admin.NET(ZRAdmin),它不仅可以满足项目开发的需求,还应用了一些新的特性,如R ...

  9. CPU缓存伪共享

    CPU缓存什么东西?当然这个问题很多人有可能觉得比较傻,CPU缓存什么,肯定是缓存数据(代码)啊,要不然还能缓存啥,这个确实没问题,但是CPU到底缓存什么样的数据呢?因为对CPU来说,无论是指令,还是 ...

  10. 数据库排行榜|当 DB-Engines 遇见墨天轮国产数据库排行

    提到数据库排名,此时脑海里浮现出的是什么?是 DB-Engines,还是墨天轮数据库排行?两者间有什么区别?下面来聊一下业内这两个知名数据库排名平台. 本篇文章约有 3000 字,预计阅读时间 7 分 ...