鸿蒙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'; // 日志Tagprivate 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 inputif (Array.isArray(message)) {message.forEach((msg: string | object) => {logMessage += typeof msg === 'object' ? LogUtil.getObjectToJson(msg) : String(msg);});}// Handle object inputelse if (typeof message === 'object') {logMessage = LogUtil.getObjectToJson(message);}// Handle string inputelse {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 levelswitch (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 enabledswitch (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'; // 日志Tagprivate 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 inputif (Array.isArray(message)) {message.forEach((msg: string | object) => {logMessage += typeof msg === 'object' ? LogUtil.getObjectToJson(msg) : String(msg);});}// Handle object inputelse if (typeof message === 'object') {logMessage = LogUtil.getObjectToJson(message);}// Handle string inputelse {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 levelswitch (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 enabledswitch (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;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/74186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU源码编译部署单实例redis7.2.6》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、环境信息 环境信息如下&#xff1a; 主机IP 操作系统 Redis版本 CPU架构 192.168.1.111 K…

基于LSTM的文本分类1——模型搭建

源码 # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as npclass Config(object):"""配置参数类&#xff0c;用于存储模型和训练的超参数"""def __init__(self, dataset, embedding):self.…

小了 60,500 倍,但更强;AI 的“深度诅咒”

作者&#xff1a;Ignacio de Gregorio 图片来自 Unsplash 的 Bahnijit Barman 几周前&#xff0c;我们看到 Anthropic 尝试训练 Claude 去通关宝可梦。模型是有点进展&#xff0c;但离真正通关还差得远。 但现在&#xff0c;一个独立的小团队用一个只有一千万参数的模型通关了…

nextjs使用02

并行路由 同一个页面&#xff0c;放多个路由&#xff0c;&#xff0c; 目录前面加,layout中可以当作插槽引入 import React from "react";function layout({children,notifications,user}:{children:React.ReactNode,notifications:React.ReactNode,user:React.Re…

github 无法在shell里链接

当我在shell端git push时&#xff0c;我发现总是22 timeout的问题。 我就进行了以下步骤的尝试并最终得到了解决。 第一步&#xff0c;我先确定我可以curl github&#xff0c;也就是我网络没问题 curl -v https://github.com 如果这个时候不超时和报错&#xff0c;说明网络…

当前主流的大模型知识库软件对比分析

以下是当前主流的大模型知识库软件对比分析&#xff0c;涵盖功能特性、适用场景及优劣势&#xff0c;结合最新技术动态和行业实践提供深度选型参考&#xff1a; 一、企业级智能知识库平台 1. 阿里云百炼&#xff08;Model Studio&#xff09; 核心能力&#xff1a;基于RAG技…

Java的比较器 Comparable 和 Comparator

在 Java 中&#xff0c;Comparable 和 Comparator 是用于对象排序的重要接口。它们提供了不同的排序方式&#xff0c;适用于不同的需求&#xff0c;同时在 Java 底层排序算法中发挥着关键作用。本文将从基础概念、使用方法、排序实现&#xff08;包括升序、降序&#xff09;、底…

基于Qlearning强化学习的太赫兹信道信号检测与识别matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 太赫兹信道特性 2.2 Q-learning强化学习基础 2.3 基于Q-learning 的太赫兹信道信号检测与识别系统 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2024b仿真结果如下&#xff08;完整代码运行后无水印…

力扣刷题————199.二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5,null,4] 输出&#xff1a;[1,3,4] 解题思路&#xff1a;我们可以想到这…

文件包含漏洞的小点总结

文件本地与远程包含&#xff1a; 文件包含有本地包含与远程包含的区别&#xff1a;本地包含只能包含服务器已经有的问题&#xff1b; 远程包含可以包含一切网络上的文件。 本地包含&#xff1a; ①无限制 感受一下使用phpstudy的文件上传&#xff0c;开启phpstudy的apache…

深度学习处理时间序列(5)

Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过&#xff0c;二者有一点小区别&#xff1a;SimpleRNN层能够像其他Keras层一样处理序列批量&#xff0c;而不是像NumPy示例中的那样只能处理单个序列。也就是说&#xff0c;它接收形状为(batch_si…

操作系统相关知识点

操作系统在进行线程切换时需要进行哪些动作&#xff1f; 保存当前线程的上下文 保存寄存器状态、保存栈信息。 调度器选择下一个线程 调度算法决策&#xff1a;根据策略&#xff08;如轮转、优先级、公平共享&#xff09;从就绪队列选择目标线程。 处理优先级&#xff1a;实时…

从0到1:Rust 如何用 FFmpeg 和 OpenGL 打造硬核视频特效

引言&#xff1a;视频特效开发的痛点&#xff0c;你中了几个&#xff1f; 视频特效如今无处不在&#xff1a;短视频平台的滤镜美化、直播间的实时美颜、影视后期的电影级调色&#xff0c;甚至 AI 生成内容的动态效果。无论是个人开发者还是团队&#xff0c;视频特效都成了吸引…

【并发编程 | 第一篇】线程相关基础知识

1.并发和并行有什么区别 并发是指多核CPU上的多任务处理&#xff0c;多个任务在同一时刻真正同时执行。 并行是指单核CPU上的多任务处理&#xff0c;多个任务在同一时间段内交替执行&#xff0c;通过时间片轮转实现交替执行&#xff0c;用于解决IO密集型瓶颈。 如何理解线程安…

Kafka 偏移量

在 Apache Kafka 中&#xff0c;偏移量&#xff08;Offset&#xff09;是一个非常重要的概念。它不仅用于标识消息的位置&#xff0c;还在多种场景中发挥关键作用。本文将详细介绍 Kafka 偏移量的核心概念及其使用场景。 一、偏移量的核心概念 1. 定义 偏移量是一个非负整数…

18.redis基本操作

Redis(Remote Dictionary Server)是一个开源的、高性能的键值对(Key-Value)存储数据库,广泛应用于缓存、消息队列、实时分析等场景。它以其极高的读写速度、丰富的数据结构和灵活的应用方式而受到开发者的青睐。 Redis 的主要特点 ​高性能: ​内存存储:Redis 将所有数…

历年跨链合约恶意交易详解(一)——THORChain退款逻辑漏洞

漏洞合约函数 function returnVaultAssets(address router, address payable asgard, Coin[] memory coins, string memory memo) public payable {if (router address(this)){for(uint i 0; i < coins.length; i){_adjustAllowances(asgard, coins[i].asset, coins[i].a…

通俗易懂的讲解SpringBean生命周期

&#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

深入理解 `git pull --rebase` 与 `--allow-unrelated-histories`:区别、原理与实战指南

&#x1f680; git pull --rebase vs --allow-unrelated-histories 全面解析 在日常使用 Git 时&#xff0c;我们经常遇到两种拉取远程代码的方式&#xff1a;git pull --rebase 和 git pull --allow-unrelated-histories。它们的区别是什么&#xff1f;各自适用哪些场景&…

Matlab_Simulink中导入CSV数据与仿真实现方法

前言 在Simulink仿真中&#xff0c;常需将外部数据&#xff08;如CSV文件或MATLAB工作空间变量&#xff09;作为输入信号驱动模型。本文介绍如何高效导入CSV数据至MATLAB工作空间&#xff0c;并通过From Workspace模块实现数据到Simulink的精确传输&#xff0c;适用于运动控制…