news 2026/6/5 23:47:36

【HarmonyOS实战】 Logger日志封装:为什么不直接用console.log?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【HarmonyOS实战】 Logger日志封装:为什么不直接用console.log?

文章目录

    • 前言
    • 一、直接用 hilog vs 封装 Logger
      • 1.1 直接用 hilog(不封装)
      • 1.2 封装后(Logger)
    • 二、Logger.ets 完整解析
    • 三、hilog 参数详解
      • 3.1 domain 业务域
      • 3.2 %{public}s 是什么?
    • 四、日志级别对比
    • 五、项目中的使用示例
      • 5.1 记录正常流程
      • 5.2 记录错误
      • 5.3 记录用户操作
    • 六、可扩展版本的 Logger
    • 七、在 DevEco Studio 查看日志
    • 总结

前言

写代码调试时,很多人习惯用console.log('打印一下')来输出信息。HarmonyOS 当然也支持console.log,但官方推荐用hilog

为什么?hilog有分级(info/warn/error)、有 domain 过滤、日志格式更规范,更适合在设备上调试复杂问题。

项目里的Logger.etshilog封装了一下,这篇文章把封装思路讲清楚,顺带教你怎么用 DevEco Studio 的日志面板调试。

项目预览

一、直接用 hilog vs 封装 Logger

1.1 直接用 hilog(不封装)

import{hilog}from'@kit.PerformanceAnalysisKit';// 每次都要写这三个参数hilog.info(0x0000,'NearByGasStationDemo','%{public}s, %{public}s',['初始化','成功']);hilog.error(0x0000,'NearByGasStationDemo','%{public}s, %{public}s',['出错',err.message]);

问题:

  • 0x0000是什么?每次都要记
  • 'NearByGasStationDemo'是前缀,每次都要写一遍
  • 格式字符串'%{public}s, %{public}s'固定,但每次都要复制

1.2 封装后(Logger)

Logger.info('testTag','初始化成功');Logger.error('testTag',`出错了:${err.message}`);

封装后只需要传关键信息(tag + 消息),其他的都在 Logger 类里统一处理。

二、Logger.ets 完整解析

// entry/src/main/ets/utils/Logger.etsimport{hilog}from'@kit.PerformanceAnalysisKit';exportclassLogger{// 私有静态属性:这些是 hilog 的固定参数privatestaticdomain:number=0x0000;// 业务域(用于过滤日志)privatestaticprefix:string='NearByGasStationDemo';// 日志前缀(标识来源)privatestaticformat:string='%{public}s, %{public}s';// 格式字符串// DEBUG 级别:只在开发时有用,发布版本会被过滤staticdebug(...args:string[]):void{hilog.debug(Logger.domain,Logger.prefix,Logger.format,args);}// INFO 级别:正常运行信息staticinfo(...args:string[]):void{hilog.info(Logger.domain,Logger.prefix,Logger.format,args);}// WARN 级别:警告(不影响运行,但需要关注)staticwarn(...args:string[]):void{hilog.warn(Logger.domain,Logger.prefix,Logger.format,args);}// ERROR 级别:错误(影响功能)staticerror(...args:string[]):void{hilog.error(Logger.domain,Logger.prefix,Logger.format,args);}}

三、hilog 参数详解

hilog.info(domain,tag,format,...args)
参数类型说明
domainnumber业务域,0x0000-0xFFFF,用于在日志面板过滤
tagstring日志标签,标识日志来源(类似 Android 的 Tag)
formatstring格式字符串,%{public}s是公开字符串占位符
argsany[]填充格式字符串的参数

3.1 domain 业务域

domain是一个 16 进制数字,用于按业务模块分组日志。比如:

// 不同模块使用不同 domain,方便过滤constMAP_DOMAIN=0x0001;// 地图模块constPERMISSION_DOMAIN=0x0002;// 权限模块constNETWORK_DOMAIN=0x0003;// 网络模块

项目里统一用0x0000,简化处理。

3.2 %{public}s 是什么?

%{public}s是 hilog 的格式占位符,{public}表示这是公开日志(会显示实际内容)。如果用%{private}s,敏感信息会被替换为<private>保护隐私。

// public:日志里显示实际值hilog.info(0x0000,'tag','%{public}s',['用户名: 张三']);// 输出: 用户名: 张三// private:日志里显示 <private>hilog.info(0x0000,'tag','%{private}s',['密码: 123456']);// 输出: <private>

四、日志级别对比

级别方法颜色(DevEco日志面板)用途
DEBUGLogger.debug蓝色开发时的详细调试信息
INFOLogger.info绿色/白色正常运行流程记录
WARNLogger.warn黄色警告,可能影响体验
ERRORLogger.error红色错误,功能受影响

发布到应用市场时,debug级别的日志会被系统过滤,不会显示,避免性能损耗和信息泄露。

五、项目中的使用示例

5.1 记录正常流程

// EntryAbility.etsonCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{hilog.info(DOMAIN,'testTag','%{public}s','Ability onCreate');}onWindowStageCreate(windowStage:window.WindowStage):void{hilog.info(DOMAIN,'testTag','%{public}s','Ability onWindowStageCreate');// ...windowStage.loadContent('pages/MainPage',(err)=>{if(err.code){hilog.error(DOMAIN,'testTag','Failed to load the content. Cause: %{public}s',JSON.stringify(err));return;}hilog.info(DOMAIN,'testTag','Succeeded in loading the content.');});}

5.2 记录错误

// PermissionsUtil.ets}catch(error){Logger.error(`Failed to get bundle info for self. Code is${error.code}, message is${error.message}`);}// MapUtil.ets(用 hilog 直接调用)if(err){Logger.error('testTag',`init fail, code:${err.code}, message:${err.message}`);return;}

5.3 记录用户操作

// GasStationPage.etsthis.mapController.on('myLocationButtonClick',()=>{Logger.info('testTag','Jump to my location');// ...});

六、可扩展版本的 Logger

项目里的 Logger 比较基础,生产级别的 Logger 可以加更多功能:

exportclassLogger{privatestaticdomain:number=0x0000;privatestaticprefix:string='NearByGasStationDemo';privatestaticformat:string='%{public}s, %{public}s';privatestaticisDebugMode:boolean=true;// 可通过配置关闭 debug 日志staticdebug(...args:string[]):void{if(Logger.isDebugMode){hilog.debug(Logger.domain,Logger.prefix,Logger.format,args);}}// 带时间戳的错误日志staticerrorWithTime(tag:string,message:string):void{lettimestamp=newDate().toISOString();hilog.error(Logger.domain,Logger.prefix,Logger.format,[`[${timestamp}]`,`${tag}:${message}`]);}// 格式化对象输出(调试用)staticlogObject(tag:string,obj:object):void{try{Logger.debug(tag,JSON.stringify(obj,null,2));}catch{Logger.debug(tag,String(obj));}}}

七、在 DevEco Studio 查看日志

  1. 运行应用后,点击底部Log标签页
  2. 选择设备和进程(你的应用包名)
  3. 在搜索框里输入NearByGasStationDemo(我们定义的 prefix)过滤日志
  4. 可以按级别过滤(Debug / Info / Warn / Error)

常用日志过滤技巧:

  • tag过滤:搜索testTag
  • 错误级别过滤:点击顶部的 Error 按钮
  • 关键字过滤:直接输入关键字

总结

Logger 封装的核心价值:

  1. 统一配置domainprefixformat只在一处配置
  2. 简化调用:调用方只传 tag 和消息,不关心 hilog 的具体参数
  3. 方便控制:想在生产环境关闭 debug 日志,只改一处
  4. 类型安全static方法直接调用,不需要实例化

console.log不是不能用,但hilog在 HarmonyOS 上更规范、更好过滤、更安全(可以保护私密信息)。封装成 Logger,以后维护起来也更方便。

下一篇讲CalculateUtil 距离计算——怎么用经纬度算出两点之间的距离(公里数)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 23:42:36

从手机信号到无人机图传:揭秘‘自由空间公式’如何影响你身边所有无线设备的‘命脉’——距离

从手机信号到无人机图传&#xff1a;揭秘‘自由空间公式’如何影响你身边所有无线设备的‘命脉’——距离你是否曾在小区角落焦急地举着手机寻找信号&#xff1f;或是眼睁睁看着无人机图传画面突然卡顿&#xff1f;这些日常困扰背后&#xff0c;其实隐藏着一个被称为"自由…

作者头像 李华
网站建设 2026/6/5 23:42:35

教育工作者必看的AI学习整合实战手册(含教育部备案工具白名单)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;教育工作者必看的AI学习整合实战手册&#xff08;含教育部备案工具白名单&#xff09; 在“双减”与教育数字化转型双重背景下&#xff0c;AI技术正从辅助工具升级为教学设计的核心要素。本手册聚焦一线教师真…

作者头像 李华
网站建设 2026/6/5 23:37:12

uniapp打包原生App流程及兼容性适配

文档版本更新日期更新内容1.0.02026/6/31.app打包Android流程及兼容性问题适配 背景 开发环境 开发工具: Visual Studio Code/HBuilderX5.0.7 部署目标: cli编译器版本&#xff1a;3.3.13/vue 2 基础配置 1.将三方分包集成到当前框架项目里面&#xff08;框架源码&#x…

作者头像 李华
网站建设 2026/6/5 23:37:12

【毕业设计】基于springboot+微信小程序的视频点播微信小程序基于springboot后端的微信小程序视频点播(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/5 23:34:34

2026年软件工程师与产品经理的角色重定位

软件工程师与产品经理的角色重定位这一段时间我一直在spec coding&#xff0c;ai agent的高效输出远超我的认知带宽&#xff0c;而且在具备优秀Harness的前提&#xff0c;ai生成的代码质量已经超过我的水平。我的核心能力已经被ai agent超越&#xff0c;这是一次危机&#xff0…

作者头像 李华