写点什么

鸿蒙封装日志库并支持跳转显示行号

作者:龙儿筝
  • 2024-10-31
    上海
  • 本文字数:1371 字

    阅读完需:约 4 分钟

鸿蒙封装日志库并支持跳转显示行号

查看日志时,你是否经常遇到不知道日志是哪个地方打印的,为了便于查找位置,专门将文件名或类名设置为 tag,日志还得传个标记,用于生产环境不打印日志,控制台的日志要是能点击定位到所在位置就好了。现在咱们自己来封装一个日志库,实现这些功能。

为什么控制台的日志可以点击跳转

首页我们思考一个问题,什么样的日志可以点击跳转到所在位置呢?为什么这样的日志就可以跳转呢?最常见的场景是当程序崩溃时,我们会查看控制台的报错信息,看一下出错的调用栈,调用栈会显示代码所有文件的行号和位置,示例如下


Reason:TypeErrorError name:TypeErrorError message:Cannot read property length of undefinedStacktrace:    at anonymous (products/entry/src/main/ets/entryability/EntryAbility.ets:11:19)
复制代码


我们点击一下文件就可以跳转过去了,是不是我们的日志只要包含文件的具体路径和行列号就行了呢?我们可以手动打印一下这个at anonymous (products/entry/src/main/ets/entryability/EntryAbility.ets:11:19),发现确定可以点击跳转。

如何实现日志的跳转功能

现在我们只要能获取到打印日志时所在文件的行号和列号就可以了。程序出错时,会显示程序的调用栈,在调用栈中,我们可以获取到文件的位置,那我们创建一个 Error 对象,就可以获取到调用栈了,示例如下


function log(text: string): void {  if (hilog.isLoggable(0xFF01, 'aloe', hilog.LogLevel.INFO)) {    const err= new Error(text)    const msg = err.message + err.stack?.split('\n')[1]    hilog.info(0xFF01, 'aloe', '%{public}s', msg)  }}
复制代码


这里我们不需要完整的调用栈,用换行符分割取第二条,第一条是当前方法,第二条是调用的地方,所以我们取第二条,实际情况由于不同的封装,这里所取的位置会有所不同。

如何屏蔽生产环境不打印日志

一般我们会设置一个参数用于是否屏蔽参数,初始化时判断release环境就屏蔽掉,其实这种方式不太准确,因为我们没上架前,会遇到release环境查看日志的情况,推荐打 APP 包,准备上架时,将此参数设置为不打印,所以编译时,我们判断下是否打 APP 包就行了,示例如下,首先在build-profile.json5中设置参数,默认打印日志


{  "apiType": "stageMode",  "buildOption": {    "arkOptions": {      "buildProfileFields": {        "LOG_ENABLE": true      }    }  }}
复制代码


然后在hvigorfile.ts中判断上架环境并设置为不打印日志,示例如下


import { hapTasks, OhosHapContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin'import { hvigor, getNode } from '@ohos/hvigor'
const entryNode = getNode(__filename)entryNode.afterNodeEvaluate(node => { if (hvigor.getCommandEntryTask()[0] === 'assembleApp') { const hapCtx = node.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext const profileOpt = hapCtx.getBuildProfileOpt() const fields = profileOpt['buildOption']['arkOptions']['buildProfileFields'] fields['LOG_ENABLE']=false hapCtx.setBuildProfileOpt(profileOpt) }})
复制代码


我们只要在封装的日志库中加上BuildProfile.LOG_ENABLE判断就可以屏蔽线上日志了,同时自己调试时,release环境也能正常查看日志,也不用外部传参了,是不是很方便。


发布于: 刚刚阅读数: 5
用户头像

龙儿筝

关注

还未添加个人签名 2024-10-27 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙封装日志库并支持跳转显示行号_鸿蒙_龙儿筝_InfoQ写作社区