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

鸿蒙NEXT开发日志工具类(ArkTs)

import hilog from '@ohos.hilog';
import { JSON } from '@kit.ArkTS';
import { BusinessError } from '@kit.BasicServicesKit';
import { StrUtil } from './StrUtil';

/**
 * 日志工具类
 * author: 鸿蒙布道师
 * since: 2024/03/31
 */
export class LogUtil {
  private static logSize: number = 2048;
  private static domain: number = 0x0000;
  private static tag: string = 'HarmonyUtilsLog'; // 日志Tag
  private static showLog: boolean = true; // 是否显示打印日志
  private static isHilog: boolean = true; // true-hilog、false-console

  /**
   * 初始化日志参数(该方法建议在Ability里调用)
   * @param domain - 领域标识
   * @param tag - 日志标签
   * @param showLog - 是否显示日志
   * @param isHilog - 是否使用hilog
   */
  static init(domain: number = LogUtil.domain, tag: string = LogUtil.tag, showLog: boolean = true,
    isHilog: boolean = true): void {
    LogUtil.domain = domain;
    LogUtil.tag = tag;
    LogUtil.showLog = showLog;
    LogUtil.isHilog = isHilog;
  }

  /**
   * 设置领域标识
   * @param domain - 领域标识
   */
  static setDomain(domain: number = LogUtil.domain): void {
    LogUtil.domain = domain;
  }

  /**
   * 设置日志标签
   * @param tag - 日志标签
   */
  static setTag(tag: string = LogUtil.tag): void {
    LogUtil.tag = tag;
  }

  /**
   * 设置是否显示日志
   * @param showLog - 是否显示日志
   */
  static setShowLog(showLog: boolean = true): void {
    LogUtil.showLog = showLog;
  }

  /**
   * 设置日志打印方式
   * @param isHilog - true-hilog、false-console
   */
  static setHilog(isHilog: boolean): void {
    LogUtil.isHilog = isHilog;
  }

  /**
   * 打印DEBUG级别日志
   * @param args - 日志内容
   */
  static debug(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.DEBUG);
  }

  /**
   * 打印INFO级别日志
   * @param args - 日志内容
   */
  static info(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.INFO);
  }

  /**
   * 打印WARN级别日志
   * @param args - 日志内容
   */
  static warn(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.WARN);
  }

  /**
   * 打印ERROR级别日志
   * @param args - 日志内容
   */
  static error(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.ERROR);
  }

  /**
   * 打印FATAL级别日志
   * @param args - 日志内容
   */
  static fatal(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.FATAL);
  }

  /**
   * 打印JSON对象或JSON字符串
   * @param msg - JSON对象或字符串
   */
  static print(msg: object | string): void {
    try {
      const content = LogUtil.formatMessage(msg);
      const len = Math.ceil(content.length / LogUtil.logSize);
      for (let i = 0; i < len; i++) {
        const end = Math.min((i + 1) * LogUtil.logSize, content.length);
        const logMsg = `\n${content.substring(i * LogUtil.logSize, end)}`;
        LogUtil.levelLog(logMsg, hilog.LogLevel.DEBUG);
      }
    } catch (err) {
      const error = err as BusinessError;
      console.error(`LogUtil-print-异常 ~ code: ${error.code} -·- message: ${error.message}`);
    }
  }

  /**
   * 统一日志输出
   * @param message - 日志内容
   * @param level - 日志级别
   */
  private static uniLog(message: (string | object)[], level: hilog.LogLevel): void {
    if (!LogUtil.showLog) return;

    const topLine = LogUtil.getLine(LogUtil.tag);
    LogUtil.levelLog(topLine, level);

    if (level === hilog.LogLevel.ERROR) {
      const locationLog = LogUtil.getLogLocation();
      LogUtil.levelLog(locationLog, level);
    }

    const content = LogUtil.formatMessage(message);
    const len = Math.ceil(content.length / LogUtil.logSize);
    for (let i = 0; i < len; i++) {
      const end = Math.min((i + 1) * LogUtil.logSize, content.length);
      const logMsg = `\n|  ${content.substring(i * LogUtil.logSize, end)}`;
      LogUtil.levelLog(logMsg, level);
    }

    const bottomLine = LogUtil.getLine('');
    LogUtil.levelLog(bottomLine, level);
  }

  /**
   * 格式化日志内容
   * @param message - 日志内容,可以是字符串、对象或数组
   */
  private static formatMessage(message: (string | object)[] | object | string): string {
    let logMessage = '';

    // Handle array input
    if (Array.isArray(message)) {
      message.forEach((msg: string | object) => {
        logMessage += typeof msg === 'object' ? LogUtil.getObjectToJson(msg) : String(msg);
      });
    }
    // Handle object input
    else if (typeof message === 'object') {
      logMessage = LogUtil.getObjectToJson(message);
    }
    // Handle string input
    else {
      logMessage = String(message);
    }

    return logMessage;
  }

  /**
   * 对象转JSON字符串
   * @param obj - 对象
   * @param line - 是否格式化换行
   */
  private static getObjectToJson(obj: object, line: boolean = true): string {
    try {
      let jsonStr = JSON.stringify(obj, null, 2);
      if (line) {
        jsonStr = jsonStr.replace(/\n/g, '\n|\t');
        jsonStr = jsonStr.replace(/..$/, '  ');
      }
      return jsonStr;
    } catch {
      return '';
    }
  }

  /**
   * 获取代码位置
   */
  private static getLogLocation(): string {
    const stackArray = new Error().stack?.split('\n').filter(item => item.trim() !== '').splice(-2) ?? [];
    const errorLocation = stackArray.join('\n').replace(/\s+/g, '');
    return `\n|  ${errorLocation}`;
  }

  /**
   * 获取生成的日志边框
   * @param tag - 日志标签
   * @param length - 边框长度
   */
  private static getLine(tag: string = '', length: number = 160): string {
    if (StrUtil.isNotEmpty(tag)) {
      return `┌${StrUtil.repeat('─', 10)} ${tag} ${StrUtil.repeat('─', length - tag.length - 2)}`;
    }
    return `└${StrUtil.repeat('─', 10)}${StrUtil.repeat('─', length)}`;
  }

  /**
   * 日志打印
   * @param msg - 日志内容
   * @param level - 日志级别
   */
  private static levelLog(msg: string, level: hilog.LogLevel): void {
    if (LogUtil.isHilog) {
      // Explicitly call the appropriate hilog method based on the log level
      switch (level) {
        case hilog.LogLevel.DEBUG:
          hilog.debug(LogUtil.domain, LogUtil.tag, msg);
          break;
        case hilog.LogLevel.INFO:
          hilog.info(LogUtil.domain, LogUtil.tag, msg);
          break;
        case hilog.LogLevel.WARN:
          hilog.warn(LogUtil.domain, LogUtil.tag, msg);
          break;
        case hilog.LogLevel.ERROR:
          hilog.error(LogUtil.domain, LogUtil.tag, msg);
          break;
        case hilog.LogLevel.FATAL:
          hilog.fatal(LogUtil.domain, LogUtil.tag, msg);
          break;
        default:
          console.error(`Unsupported log level: ${level}`);
          break;
      }
    } else {
      // Fallback to console logging if hilog is not enabled
      switch (level) {
        case hilog.LogLevel.DEBUG:
          console.debug(msg);
          break;
        case hilog.LogLevel.INFO:
          console.info(msg);
          break;
        case hilog.LogLevel.WARN:
          console.warn(msg);
          break;
        case hilog.LogLevel.ERROR:
          console.error(msg);
          break;
        case hilog.LogLevel.FATAL:
          console.log(msg);
          break;
        default:
          console.error(`Unsupported log level: ${level}`);
          break;
      }
    }
  }
}

代码如下:

import hilog from '@ohos.hilog';
import { JSON } from '@kit.ArkTS';
import { BusinessError } from '@kit.BasicServicesKit';
import { StrUtil } from './StrUtil';

/**
 * 日志工具类
 * author: 鸿蒙布道师
 * since: 2024/03/31
 */
export class LogUtil {
  private static logSize: number = 2048;
  private static domain: number = 0x0000;
  private static tag: string = 'HarmonyUtilsLog'; // 日志Tag
  private static showLog: boolean = true; // 是否显示打印日志
  private static isHilog: boolean = true; // true-hilog、false-console

  /**
   * 初始化日志参数(该方法建议在Ability里调用)
   * @param domain - 领域标识
   * @param tag - 日志标签
   * @param showLog - 是否显示日志
   * @param isHilog - 是否使用hilog
   */
  static init(domain: number = LogUtil.domain, tag: string = LogUtil.tag, showLog: boolean = true,
    isHilog: boolean = true): void {
    LogUtil.domain = domain;
    LogUtil.tag = tag;
    LogUtil.showLog = showLog;
    LogUtil.isHilog = isHilog;
  }

  /**
   * 设置领域标识
   * @param domain - 领域标识
   */
  static setDomain(domain: number = LogUtil.domain): void {
    LogUtil.domain = domain;
  }

  /**
   * 设置日志标签
   * @param tag - 日志标签
   */
  static setTag(tag: string = LogUtil.tag): void {
    LogUtil.tag = tag;
  }

  /**
   * 设置是否显示日志
   * @param showLog - 是否显示日志
   */
  static setShowLog(showLog: boolean = true): void {
    LogUtil.showLog = showLog;
  }

  /**
   * 设置日志打印方式
   * @param isHilog - true-hilog、false-console
   */
  static setHilog(isHilog: boolean): void {
    LogUtil.isHilog = isHilog;
  }

  /**
   * 打印DEBUG级别日志
   * @param args - 日志内容
   */
  static debug(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.DEBUG);
  }

  /**
   * 打印INFO级别日志
   * @param args - 日志内容
   */
  static info(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.INFO);
  }

  /**
   * 打印WARN级别日志
   * @param args - 日志内容
   */
  static warn(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.WARN);
  }

  /**
   * 打印ERROR级别日志
   * @param args - 日志内容
   */
  static error(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.ERROR);
  }

  /**
   * 打印FATAL级别日志
   * @param args - 日志内容
   */
  static fatal(...args: (string | object)[]): void {
    LogUtil.uniLog(args, hilog.LogLevel.FATAL);
  }

  /**
   * 打印JSON对象或JSON字符串
   * @param msg - JSON对象或字符串
   */
  static print(msg: object | string): void {
    try {
      const content = LogUtil.formatMessage(msg);
      const len = Math.ceil(content.length / LogUtil.logSize);
      for (let i = 0; i < len; i++) {
        const end = Math.min((i + 1) * LogUtil.logSize, content.length);
        const logMsg = `\n${content.substring(i * LogUtil.logSize, end)}`;
        LogUtil.levelLog(logMsg, hilog.LogLevel.DEBUG);
      }
    } catch (err) {
      const error = err as BusinessError;
      console.error(`LogUtil-print-异常 ~ code: ${error.code} -·- message: ${error.message}`);
    }
  }

  /**
   * 统一日志输出
   * @param message - 日志内容
   * @param level - 日志级别
   */
  private static uniLog(message: (string | object)[], level: hilog.LogLevel): void {
    if (!LogUtil.showLog) return;

    const topLine = LogUtil.getLine(LogUtil.tag);
    LogUtil.levelLog(topLine, level);

    if (level === hilog.LogLevel.ERROR) {
      const locationLog = LogUtil.getLogLocation();
      LogUtil.levelLog(locationLog, level);
    }

    const content = LogUtil.formatMessage(message);
    const len = Math.ceil(content.length / LogUtil.logSize);
    for (let i = 0; i < len; i++) {
      const end = Math.min((i + 1) * LogUtil.logSize, content.length);
      const logMsg = `\n|  ${content.substring(i * LogUtil.logSize, end)}`;
      LogUtil.levelLog(logMsg, level);
    }

    const bottomLine = LogUtil.getLine('');
    LogUtil.levelLog(bottomLine, level);
  }

  /**
   * 格式化日志内容
   * @param message - 日志内容,可以是字符串、对象或数组
   */
  private static formatMessage(message: (string | object)[] | object | string): string {
    let logMessage = '';

    // Handle array input
    if (Array.isArray(message)) {
      message.forEach((msg: string | object) => {
        logMessage += typeof msg === 'object' ? LogUtil.getObjectToJson(msg) : String(msg);
      });
    }
    // Handle object input
    else if (typeof message === 'object') {
      logMessage = LogUtil.getObjectToJson(message);
    }
    // Handle string input
    else {
      logMessage = String(message);
    }

    return logMessage;
  }

  /**
   * 对象转JSON字符串
   * @param obj - 对象
   * @param line - 是否格式化换行
   */
  private static getObjectToJson(obj: object, line: boolean = true): string {
    try {
      let jsonStr = JSON.stringify(obj, null, 2);
      if (line) {
        jsonStr = jsonStr.replace(/\n/g, '\n|\t');
        jsonStr = jsonStr.replace(/..$/, '  ');
      }
      return jsonStr;
    } catch {
      return '';
    }
  }

  /**
   * 获取代码位置
   */
  private static getLogLocation(): string {
    const stackArray = new Error().stack?.split('\n').filter(item => item.trim() !== '').splice(-2) ?? [];
    const errorLocation = stackArray.join('\n').replace(/\s+/g, '');
    return `\n|  ${errorLocation}`;
  }

  /**
   * 获取生成的日志边框
   * @param tag - 日志标签
   * @param length - 边框长度
   */
  private static getLine(tag: string = '', length: number = 160): string {
    if (StrUtil.isNotEmpty(tag)) {
      return `┌${StrUtil.repeat('─', 10)} ${tag} ${StrUtil.repeat('─', length - tag.length - 2)}`;
    }
    return `└${StrUtil.repeat('─', 10)}${StrUtil.repeat('─', length)}`;
  }

  /**
   * 日志打印
   * @param msg - 日志内容
   * @param level - 日志级别
   */
  private static levelLog(msg: string, level: hilog.LogLevel): void {
    if (LogUtil.isHilog) {
      // Explicitly call the appropriate hilog method based on the log level
      switch (level) {
        case hilog.LogLevel.DEBUG:
          hilog.debug(LogUtil.domain, LogUtil.tag, msg);
          break;
        case hilog.LogLevel.INFO:
          hilog.info(LogUtil.domain, LogUtil.tag, msg);
          break;
        case hilog.LogLevel.WARN:
          hilog.warn(LogUtil.domain, LogUtil.tag, msg);
          break;
        case hilog.LogLevel.ERROR:
          hilog.error(LogUtil.domain, LogUtil.tag, msg);
          break;
        case hilog.LogLevel.FATAL:
          hilog.fatal(LogUtil.domain, LogUtil.tag, msg);
          break;
        default:
          console.error(`Unsupported log level: ${level}`);
          break;
      }
    } else {
      // Fallback to console logging if hilog is not enabled
      switch (level) {
        case hilog.LogLevel.DEBUG:
          console.debug(msg);
          break;
        case hilog.LogLevel.INFO:
          console.info(msg);
          break;
        case hilog.LogLevel.WARN:
          console.warn(msg);
          break;
        case hilog.LogLevel.ERROR:
          console.error(msg);
          break;
        case hilog.LogLevel.FATAL:
          console.log(msg);
          break;
        default:
          console.error(`Unsupported log level: ${level}`);
          break;
      }
    }
  }
}

相关文章:

  • 全新UI好看404页面源码
  • Unity的UI适配
  • Qt常用宏定义判断大全
  • 从纸质到 AI 时代:我的笔记工具探索之旅
  • Z-Wave与Matter的协同应用:构建无缝互联的智能家居
  • 2025年华为HCIP题库分享
  • PyTorch + torchvision是什么
  • 《深度学习》——bert框架
  • Axure项目实战:智慧运输平台后台管理端-承运商管理(中继器筛选)
  • 设计模式扩展 MyBatis Plus BaseMapper接口
  • java学习笔记10——集合框架
  • 蚂蚁集团主导的ISO密码学国际标准立项,纳入国产算法
  • AI赋能股票:流通股本与总股本:定义、区别及投资意义解析
  • 【STM32单片机】#4 OLED调试外部中断
  • StarRocks的执行计划和Profile
  • 微软 GraphRAG 项目学习总结
  • ubuntu的ubuntu--vg-ubuntu--lv磁盘扩容
  • 黑盒测试、白盒测试、集成测试和系统测试的区别与联系
  • 在 Windows 中使用 DeepSeek 和 Milvus 搭建个人知识库
  • 新加坡国立大学张阳团队开发第二代RNA结构预测算法,多项基准测试超越SOTA
  • 武汉专业做网站开发的公司/教育培训学校
  • 查网站排名/建站cms
  • python做网站好吗/免费网络空间搜索引擎
  • 抚顺市城市建设档案馆网站/网络营销推广工作内容
  • 用word怎么做首页网站/南京seo优化
  • php+缺少+wordpress/关键词优化seo多少钱一年