Logger.ets 3.85 KB
import hilog from '@ohos.hilog';

/**
 * Log level define
 *
 * @syscap SystemCapability.HiviewDFX.HiLog
 */
enum LogLevel {
  DEBUG = 3,
  INFO = 4,
  WARN = 5,
  ERROR = 6,
  FATAL = 7
}

/**
 * Common log for all features.
 *
 * @param {string} prefix Identifies the log tag.
 */
export class Logger {
  private static domain: number = 0xFF00;
  private static prefix: string = 'SightApp';
  private static format: string = `%{public}s, %{public}s`;
  private static format_ext: string = `%{public}s`;
  /**
   * 暂时没找到限制大小相关文档,尝试4000是不行的,3500可以。可以后续优化
   */
  private static CHUNK_SIZE: number = 3500;
  static isDebug: boolean = true;

  /**
   * constructor.
   *
   * @param Prefix Identifies the log tag.
   * @param domain Domain Indicates the service domain, which is a hexadecimal integer ranging from 0x0 to 0xFFFFF.
   */
  constructor(prefix: string = 'SightApp', domain: number = 0xFF00) {
    Logger.prefix = prefix;
    Logger.domain = domain;
  }

  static debug(...args: string[]) {
    if (!Logger.isDebug) {
      return
    }
    Logger.logContent(LogLevel.DEBUG, ...args)
  }

  static info(...args: string[]) {
    if (!Logger.isDebug) {
      return
    }
    Logger.logContent(LogLevel.INFO, ...args)
  }

  static warn(...args: string[]) {
    if (!Logger.isDebug) {
      return
    }
    Logger.logContent(LogLevel.WARN, ...args)
  }

  static error(...args: string[]) {
    if (!Logger.isDebug) {
      return
    }
    Logger.logContent(LogLevel.ERROR, ...args)
  }

  static fatal(...args: string[]) {
    if (!Logger.isDebug) {
      return
    }
    Logger.logContent(LogLevel.FATAL, ...args)
  }

  static isLoggable(level: LogLevel) {
    if (!Logger.isDebug) {
      return
    }
    // 判断是否打印 TODO
    hilog.isLoggable(Logger.domain, Logger.prefix, level);
  }

  static logContent(level: LogLevel, ...args: string[]) {
    let msg = Logger.getMsg(...args)
    let length = msg.length
    if (length < Logger.CHUNK_SIZE) {
      // 不超限,保持原来的打印
      Logger.print(level, ...args)
    } else {
      // 超限,分段打印
      for (let i = 0; i < length; i += Logger.CHUNK_SIZE) {
        let count = Math.min(length - i, Logger.CHUNK_SIZE);
        Logger.printExt(level, msg.substring(i, i + count));
      }
    }
  }

  static print(level: LogLevel, ...msg: string[]) {
    switch (level) {
      case LogLevel.DEBUG:
        hilog.debug(Logger.domain, Logger.prefix, Logger.format, msg);
        break
      case LogLevel.INFO:
        hilog.info(Logger.domain, Logger.prefix, Logger.format, msg);
        break
      case LogLevel.WARN:
        hilog.warn(Logger.domain, Logger.prefix, Logger.format, msg);
        break
      case LogLevel.ERROR:
        hilog.error(Logger.domain, Logger.prefix, Logger.format, msg);
        break
      case LogLevel.FATAL:
        hilog.fatal(Logger.domain, Logger.prefix, Logger.format, msg);
        break
    }
  }

  static printExt(level: LogLevel, msg: string) {
    switch (level) {
      case LogLevel.DEBUG:
        hilog.debug(Logger.domain, Logger.prefix, Logger.format_ext, msg);
        break
      case LogLevel.INFO:
        hilog.info(Logger.domain, Logger.prefix, Logger.format_ext, msg);
        break
      case LogLevel.WARN:
        hilog.warn(Logger.domain, Logger.prefix, Logger.format_ext, msg);
        break
      case LogLevel.ERROR:
        hilog.error(Logger.domain, Logger.prefix, Logger.format_ext, msg);
        break
      case LogLevel.FATAL:
        hilog.fatal(Logger.domain, Logger.prefix, Logger.format_ext, msg);
        break
    }
  }

  static getMsg(...args: string[]): string {
    if (args == null || args.length <= 0) {
      return '';
    }
    let msg = ''
    args.forEach((v) => {
      msg = msg.concat(', ').concat(v)
    })
    return msg.substring(2, msg.length);
  }
}

export default new Logger('SightApp', 0xFF00)