当前位置: 首页 > article >正文

鸿蒙开发实战:5分钟搞定本地HAR库的创建与日志工具封装

鸿蒙开发实战从零构建高可用日志工具库的全流程指南刚接触鸿蒙开发的开发者常会遇到一个矛盾官方文档看似清晰但实际动手时总被各种报错绊住脚步。本文将以日志工具库开发为例带你完整走通HAR库的创建→编码→编译→引用全流程重点解决那些文档没写但实际开发必定会踩的坑。1. 工程准备与环境配置在开始构建日志工具库前我们需要先确保开发环境正确配置。打开DevEco Studio 4.0新建一个名为HarmonyLogger的工程。这里有个关键细节工程存储路径不要包含中文或特殊字符否则后续编译时可能出现难以排查的路径错误。创建主工程后我们需要专门为日志库新建模块右键工程目录 → New → Module选择Static Library模板配置模块信息时需特别注意Module name建议采用库功能-版本号的命名方式如logger-1.0Language选择ArkTS当前推荐的首选语言Device type根据实际需求勾选通常全选即可实际踩坑提示如果后续需要包含C代码务必勾选Enable Native这个选项在模块创建后无法修改。笔者曾因漏选此选项导致整个模块需要重建。2. 日志库的核心架构设计一个健壮的日志工具库应该具备以下特性多级别日志输出DEBUG/INFO/WARN/ERROR可自定义日志标签和领域标识线程安全的日志输出可扩展的日志输出渠道基于这些需求我们在src/main/ets/common/utils/目录下创建Logger.ets文件import hilog from ohos.hilog; const DEFAULT_DOMAIN 0xFF00; // 默认领域标识 const MAX_LOG_LENGTH 1024; // 单条日志最大长度 class HarmonyLogger { private domain: number; private tag: string; private isDebug: boolean; constructor(tag: string HarmonyApp, domain: number DEFAULT_DOMAIN) { this.domain domain; this.tag tag; this.isDebug true; // 默认开启debug日志 } setDebuggable(enable: boolean): void { this.isDebug enable; } debug(...args: any[]): void { if (!this.isDebug) return; const msg args.map(arg typeof arg object ? JSON.stringify(arg) : String(arg) ).join( ); hilog.debug(this.domain, this.tag, %{public}s, msg); } info(...args: any[]): void { const msg args.join( ); hilog.info(this.domain, this.tag, %{public}s, msg.length MAX_LOG_LENGTH ? msg.substring(0, MAX_LOG_LENGTH) ... : msg ); } // 其他级别日志方法类似... } export default new HarmonyLogger();这段代码实现了几个关键优化点对长日志自动截断避免hilog的缓冲区溢出支持对象类型的自动序列化通过isDebug开关控制调试日志输出使用public标识确保日志内容不被混淆3. 编译配置与疑难解决完成代码编写后在编译HAR时经常会遇到三类典型问题3.1 资源文件打包配置默认情况下模块中的所有文件都会被打包到HAR中。如果希望排除某些测试文件需要在模块根目录创建.ohpmignore文件# 忽略测试目录 /src/test/ /build/ # 忽略IDE配置文件 *.iml .idea/3.2 编译时常见错误处理错误类型解决方案根本原因Cannot find module清理缓存(File → Invalidate Caches)工程索引未更新HAR not generated检查build.gradle中的arkts配置编译链配置缺失Permission denied关闭杀毒软件实时防护文件访问冲突3.3 生成HAR的两种方式图形界面操作选中模块 → Build → Make Module logger-1.0生成的HAR位于/build/default/outputs/default/logger-1.0.har命令行方式./gradlew :logger-1.0:assemble这种方式适合CI/CD环境集成可通过--info参数查看详细日志4. 多模块引用实战技巧在主工程中引用刚生成的HAR需要修改oh-package.json5文件{ dependencies: { logger: file:../logger-1.0/build/default/outputs/default/logger-1.0.har } }保存后会出现提示Run ohpm install点击执行安装。这里有几个高阶技巧技巧一本地开发时可以使用相对路径直接引用模块目录非HAR文件实现实时更新dependencies: { logger: file:../logger-1.0 }技巧二在团队协作中建议将HAR上传到私有仓库。先在.npmrc中配置仓库地址registryhttps://your.company.com/repository/ohpm/然后修改依赖声明为dependencies: { logger: ^1.0.0 }5. 日志库的进阶优化方向基础功能实现后可以考虑以下增强方案性能优化使用Worker线程异步写日志实现日志缓存批量写入添加日志文件分割功能功能扩展// 添加网络日志上报 interface LogUploader { upload(logs: string[]): Promisevoid; } class NetworkUploader implements LogUploader { async upload(logs: string[]): Promisevoid { // 实现网络上传逻辑 } } // 在Logger类中添加 setUploader(uploader: LogUploader): void { this.uploader uploader; }调试辅助添加调用栈打印功能集成性能监控日志支持日志染色输出在笔者最近参与的电商App项目中通过自定义日志库实现了以下增强功能用户行为日志自动上报分析系统关键流程的耗时统计生产环境敏感信息的自动脱敏这些优化使调试效率提升了40%异常排查时间缩短了65%。

相关文章:

鸿蒙开发实战:5分钟搞定本地HAR库的创建与日志工具封装

鸿蒙开发实战:从零构建高可用日志工具库的全流程指南 刚接触鸿蒙开发的开发者常会遇到一个矛盾:官方文档看似清晰,但实际动手时总被各种报错绊住脚步。本文将以日志工具库开发为例,带你完整走通HAR库的创建→编码→编译→引用全流…...

牛耕法vs神经网络:5种IPA覆盖算法实测对比(含OpenCV/Rviz可视化代码)

牛耕法vs神经网络:5种IPA覆盖算法实测对比与可视化实战 在移动机器人路径规划领域,全覆盖路径规划(Complete Coverage Path Planning, CCPP)算法是实现高效区域覆盖的核心技术。本文将深入对比分析5种主流IPA覆盖算法,包括经典牛耕法(Boustro…...

SpringBoot项目里RocketMQ日志把磁盘撑爆了?手把手教你用Logback配置滚动日志(附K8s容器内验证方法)

SpringBoot项目中RocketMQ日志磁盘占用问题解决方案 凌晨三点,手机突然响起刺耳的告警铃声——生产环境磁盘使用率超过95%。作为值班工程师的你瞬间清醒,迅速登录服务器排查。很快发现罪魁祸首是rocketmq_client.log文件,它已经膨胀到惊人的8…...

ESP32 DMX512与RDM协议栈开发指南

1. 项目概述esp_dmx是一款专为 Espressif ESP32 系列微控制器设计的高性能、高兼容性 DMX512-A 与 RDM(Remote Device Management)协议栈。它并非一个简单的 UART 驱动封装,而是一个完整的、符合 ANSI-ESTA E1.11 和 E1.20 标准的嵌入式通信子…...

Windows网络编程避坑:Pcap4j抓包前,如何快速识别并绑定正确的物理网卡?

Windows网络编程实战:精准识别物理网卡的高效方法论 每次在Windows环境下进行网络抓包时,你是否也经历过这样的挫败感?明明代码逻辑正确,过滤器设置无误,却始终捕获不到预期的数据包。问题的根源往往在于——选错了网卡…...

避开这些坑!Dify LLM参数配置中最容易犯的5个错误及解决方案

避开这些坑!Dify LLM参数配置中最容易犯的5个错误及解决方案 刚接触Dify LLM的技术人员常常会被其丰富的参数配置选项所吸引,但同时也容易陷入一些常见的误区。这些误区不仅会影响模型输出的质量,还可能导致资源浪费或无法达到预期效果。本文…...

纯电动汽车两档 ATM 变速箱 Simulink 模型探索

纯电动汽车两档ATM变速箱simulink模型,模型实现了两档AMT换挡策略和换挡过程仿真,内含详细文档和注释模型,可运行最近在研究纯电动汽车的动力系统,发现其中的两档 ATM 变速箱 Simulink 模型相当有趣,今天就来和大家唠唠…...

DolphinScheduler 3.1.8 资源中心(HDFS)与数据质量任务配置全攻略:告别“存储未启用”

DolphinScheduler 3.1.8 企业级数据治理实战:HDFS资源中心与Spark数据质量任务深度配置指南 1. 资源中心配置:解锁HDFS存储能力 在企业级数据调度场景中,资源中心的稳定运行直接影响工作流管理的效率。DolphinScheduler默认配置下&#xff0c…...

取证实战:当嫌疑人电脑已关机,如何利用EFDD从休眠文件提取BitLocker密钥?

休眠文件取证:从关机设备中提取BitLocker密钥的实战指南 当调查人员面对一台已经关机的加密设备时,传统的取证方法往往束手无策。但很少有人知道,即使电脑处于关机状态,硬盘上的休眠文件(hiberfil.sys)可能成为突破加密防线的关键…...

Arduino新手必看:用PS2摇杆控制舵机的完整接线与代码解析(附常见问题排查)

Arduino创意控制:PS2摇杆精准操控舵机的实战指南 从零开始的硬件交互之旅 记得第一次用Arduino让舵机随着摇杆摆动时,那种"魔法成真"的兴奋感至今难忘。作为硬件交互的经典入门项目,PS2摇杆控制舵机不仅能快速建立成就感&#xff0…...

Supervisorctl连接失败的5个常见原因及排查技巧(附真实案例)

Supervisorctl连接失败的深度排查指南:从原理到实战 引言 Supervisor作为进程管理工具中的瑞士军刀,在开发与运维工作中扮演着重要角色。然而,当熟悉的supervisorctl命令突然返回"connection refused"时,这种挫败感就像…...

Phi-3-Mini-128K一文详解:Phi-3系列tokenizer对中文长文本分词优势

Phi-3-Mini-128K一文详解:Phi-3系列tokenizer对中文长文本分词优势 1. 引言:当小模型遇上长文本 如果你用过一些开源大模型来处理长文档,可能会遇到这样的尴尬:模型要么“记性不好”,聊着聊着就忘了前面说了什么&…...

Ollama安全加固指南:从IP限制到API防护的实战策略

1. 为什么Ollama需要安全加固? 最近在本地部署大模型的热度越来越高,Ollama作为一款轻量级的本地大模型运行平台,确实给开发者带来了很多便利。但我在实际使用中发现,很多朋友安装完Ollama就直接开始用了,完全忽略了安…...

STM32固件烧录全攻略:ST-LINK Utility从安装到实战(附常见问题解决)

STM32固件烧录全攻略:ST-LINK Utility从安装到实战(附常见问题解决) 第一次接触STM32开发板时,最让人头疼的就是如何把写好的程序烧录到芯片里。作为ST官方推荐的烧录工具,ST-LINK Utility凭借其稳定性和易用性成为工程…...

STM32F4-正点原子探索者-SYSTEM文件夹下delay.c延时函数优化技巧与实践

1. 深入理解STM32F4的延时函数机制 在正点原子探索者开发板的SYSTEM文件夹中,delay.c文件承担着精确延时的重要任务。这个文件看似简单,但里面藏着不少值得深挖的技术细节。我第一次接触这个文件时,就被它的精妙设计所吸引。 delay.c的核心是…...

架构之构建高阶RAG系统的六种除幻方案

架构之构建高阶RAG系统的六种除幻方案详解 概述 RAG(Retrieval-Augmented Generation)系统在知识检索与生成过程中,常常面临幻觉问题——即模型生成的内容与事实不符或编造不存在的关联。本文档详细介绍了六种有效的除幻方案,从资…...

贝叶斯岭回归 vs 传统岭回归:5个真实数据集对比测试结果

贝叶斯岭回归与传统岭回归:5个真实数据集下的深度性能剖析 当数据科学家面对高维数据集时,正则化回归技术往往是工具箱中的首选武器。在众多选项中,岭回归因其稳定性和简单性长期占据主导地位,而贝叶斯岭回归则以其自动化特性逐渐…...

架构之构建高阶RAG系统的四大核心引擎模块

架构之构建高阶RAG系统的四大核心引擎模块详解 概述 Retrieval-Augmented Generation (RAG) 系统通过结合检索和生成能力,有效解决了大语言模型的知识局限性问题。本文档详细介绍了RAG系统的四个核心引擎模块,这些模块共同构成了RAG系统的技术架构基础。…...

Scifinder专利检索保姆级教程:从零开始掌握PatentPak的5个核心技巧

SciFinder专利检索全攻略:解锁PatentPak的5个高效工作流 当你在实验室合成一个新化合物时,专利检索往往成为最耗时的环节。传统方法需要逐页翻阅PDF文件寻找目标结构,而PatentPak的化学物质定位功能可以将这个过程缩短到几分钟。作为化学信息…...

【异常】Visual Studio Code Failed to install Visual Studio Code update. Updates may fail due to anti-vir

一、报错内容 Windows系统下VS Code自动更新时,弹出的完整报错信息(已脱敏)如下: Failed to install Visual Studio Code update. Updates may fail due to anti-virus software and/or runaway processes. Please try restarting your machine before attempting to upd…...

Qt语言家实战:从TS文件生成到多语言动态切换的完整指南

1. Qt国际化开发全景指南 第一次接触Qt多语言切换功能时,我被其优雅的设计所震撼——只需几个简单的步骤,就能让应用程序支持全球任意语言。记得2013年参与医疗设备项目时,我们仅用3天就完成了中英俄三语切换,这在传统开发中简直不…...

Footprint Expert Pro保姆级教程:5分钟搞定0805电阻封装(附Allegro环境配置避坑指南)

Footprint Expert Pro高效封装设计指南:0805电阻封装5分钟速成与Allegro环境深度优化 在电子设计自动化领域,封装设计往往是工程师最耗时却又无法回避的基础工作。传统手动绘制0805电阻封装需要经历焊盘设计、外形绘制、参数校对等十余个步骤&#xff0c…...

别再傻傻分不清了!ArcMap里要素类和要素数据集到底有啥区别?新手必看避坑指南

ArcGIS新手必读:要素类与要素数据集的本质区别与实战选择 第一次打开ArcMap时,面对"要素类"和"要素数据集"这两个看似相似的概念,大多数GIS初学者都会陷入困惑。这就像走进一家陌生的超市,面对琳琅满目的商品…...

FPGA新手必看:Vivado2014下用Verilog实现三位扭环计数器(附完整代码)

FPGA实战:从零构建三位扭环计数器的完整指南 在数字逻辑设计领域,扭环计数器作为一种特殊的移位寄存器,因其独特的反馈机制和简洁的状态循环,常被用于时序控制、状态机设计等场景。本文将带您从零开始,在Vivado2014环境…...

高德地图自定义Marker偏移问题终极解决方案(附完整代码)

高德地图自定义Marker偏移问题终极解决方案(附完整代码) 在Web前端开发中,高德地图API是处理地理信息展示的强大工具,但当我们需要展示海量点数据并使用自定义图标时,Marker偏移问题常常成为开发者的噩梦。本文将深入剖…...

UniApp小程序地图点聚合实战:从授权定位到自定义聚合样式全流程解析

1. 从零开始:UniApp地图组件基础配置 第一次接触UniApp地图开发时,我被官方文档里密密麻麻的参数搞得头晕眼花。后来在实际项目中踩过几次坑才发现,其实只要掌握几个核心配置,就能快速搭建起基础地图功能。先来看最基本的map组件声…...

Windows Docker下Gitea保姆级安装教程:用MySQL 5.7做数据库,一次搞定

Windows Docker环境下Gitea与MySQL 5.7的黄金组合部署指南 在当今软件开发领域,版本控制系统的重要性不言而喻。对于个人开发者或小型团队而言,搭建一个轻量级、高性能的自托管Git服务不仅能提高工作效率,还能确保代码资产的安全可控。本文将…...

告别电源啸叫与纹波:深度拆解UC3843单端反激电路中的误差补偿与斜坡补偿技术

攻克UC3843反激电源设计痛点:从误差补偿到斜坡补偿的实战解析 当你的UC3843反激电源在轻载时莫名振荡,满载又出现电压跌落,示波器上那些不规则的纹波和诡异的波形是否曾让你彻夜难眠?这些问题往往不是简单的元件更换能解决的&…...

【Android驱动实战】EMMC兼容性配置与DDR时序调优全解析

1. EMMC兼容性配置实战指南 第一次接触EMMC兼容性问题时,我遇到了一个典型场景:新采购的EMMC芯片在开发板上死活无法识别,系统启动时直接卡在preloader阶段。经过三天排查才发现是MemoryDeviceList配置遗漏导致。这个经历让我深刻认识到&…...

VSCode+Typst零配置写作指南:5分钟搞定论文排版环境(含实时预览技巧)

VSCodeTypst零配置写作指南:5分钟搞定论文排版环境(含实时预览技巧) 作为一名长期与学术文档打交道的写作者,我深知排版工具对写作效率的影响。从最初的Word到Markdown,再到LaTeX,每次工具迭代都伴随着学习…...