HarmonyOS NEXT实战:日志工具

举报
鸿蒙开发工程师 发表于 2025/06/25 15:18:12 2025/06/25
【摘要】 ##HarmonyOS Next实战##HarmonyOS SDK应用服务##教育##目标:封装日志工具,实现日志工具简单可用。在应用开发过程中,可在关键代码处输出日志信息。在运行应用后,通过查看日志信息来分析应用执行情况(如应用是否正常运行、代码运行时序、运行逻辑分支是否正常等)。系统提供不同的API供开发者调用并输出日志信息,即HiLog与console。两个API在使用时略有差异,本文...

##HarmonyOS Next实战##HarmonyOS SDK应用服务##教育##

目标:封装日志工具,实现日志工具简单可用。

在应用开发过程中,可在关键代码处输出日志信息。在运行应用后,通过查看日志信息来分析应用执行情况(如应用是否正常运行、代码运行时序、运行逻辑分支是否正常等)。

系统提供不同的API供开发者调用并输出日志信息,即HiLog与console。两个API在使用时略有差异,本文重点介绍HiLog的用法,console的具体用法可查看API参考console。

HiLog中定义了DEBUG、INFO、WARN、ERROR、FATAL五种日志级别,并提供了对应的方法输出不同级别的日志。

参数解析

  • domain:用于指定输出日志所对应的业务领域,取值范围为0x0000~0xFFFF,开发者可以根据需要进行自定义。
  • tag:用于指定日志标识,可以为任意字符串,建议标识调用所在的类或者业务行为。tag最多为31字节,超出后会截断,不建议使用中文字符,可能出现乱码或者对齐问题。
  • level:用于指定日志级别。取值见LogLevel。
  • format:格式字符串,用于日志的格式化输出。日志打印的格式化参数需按照“%{private flag}specifier”的格式打印。

说明

  • isLoggable()和具体日志打印接口使用的domain和tag应保持一致。
  • isLoggable()使用的level,应和具体日志打印接口级别保持一致。

约束与限制:日志最多打印4096字节,超出限制文本将被截断。

实战:

import { hilog } from '@kit.PerformanceAnalysisKit';

/**
 * 日志级别
 */
export enum LogLevel {
  debug = "debug",
  info = "info",
  warn = 'warn',
  error = "error"
}

/**
 * 日志工具
 * ###待考虑:设置打印日志级别
 */
export class LoggerKit {
  private domain: number;
  private prefix: string;
  private enableLogLevels: LogLevel[];

  /**
   * 日志记录器工具
   * @param domain 域,默认:0xABCD
   * @param prefix 前缀,默认:LoggerKit
   * @param enableLogLevels 启用日志级别,默认:全部启用
   */
  constructor(domain: number = 0xABCD, prefix: string = 'LoggerKit',
    enableLogLevels = [LogLevel.debug, LogLevel.info, LogLevel.warn, LogLevel.error]) {
    this.domain = domain;
    this.prefix = prefix;
    this.enableLogLevels = enableLogLevels;
  }

  debug(...args: string[]) {
    if (this.enableLogLevels.includes(LogLevel.debug)) {
      hilog.debug(this.domain, this.prefix, getFormat(args), args);
    }
  }

  info(...args: string[]) {
    if (this.enableLogLevels.includes(LogLevel.info)) {
      hilog.info(this.domain, this.prefix, getFormat(args), args);
    }
  }

  warn(...args: string[]) {
    if (this.enableLogLevels.includes(LogLevel.warn)) {
      hilog.warn(this.domain, this.prefix, getFormat(args), args);
    }
  }

  error(...args: string[]) {
    if (this.enableLogLevels.includes(LogLevel.error)) {
      hilog.error(this.domain, this.prefix, getFormat(args), args);
    }
  }

  static LK_domain: number = 0xABCD;
  static LK_prefix: string = 'LoggerKit';
  static LK_enableLogLevels: LogLevel[] = [LogLevel.debug, LogLevel.info, LogLevel.warn, LogLevel.error];

  static debug(...args: string[]) {
    if (LoggerKit.LK_enableLogLevels.includes(LogLevel.debug)) {
      hilog.debug(LoggerKit.LK_domain, LoggerKit.LK_prefix, getFormat(args), args);
    }
  }

  static info(...args: string[]) {
    if (LoggerKit.LK_enableLogLevels.includes(LogLevel.info)) {
      hilog.info(LoggerKit.LK_domain, LoggerKit.LK_prefix, getFormat(args), args);
    }
  }

  static warn(...args: string[]) {
    if (LoggerKit.LK_enableLogLevels.includes(LogLevel.warn)) {
      hilog.warn(LoggerKit.LK_domain, LoggerKit.LK_prefix, getFormat(args), args);
    }
  }

  static error(...args: string[]) {
    if (LoggerKit.LK_enableLogLevels.includes(LogLevel.error)) {
      hilog.error(LoggerKit.LK_domain, LoggerKit.LK_prefix, getFormat(args), args);
    }
  }
}

function getFormat(args: string[]) {
  let format = ''
  for (let i = 0; i < args.length; i++) {
    if (i == 0) {
      format = '%{public}s'
    } else {
      format += ', %{public}s'
    }
  }
  return format
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。