前言
在鸿蒙系统的开发过程中,日志定位是一个关键的调试步骤。想象一下,如果你能够轻松地在繁杂的代码中快速定位到日志产生的位置,那将会极大地提高你的开发效率。今天,我将分享一套代码,它能帮助你实现这一目标。
效果展示
当你使用这套代码时,日志的打印效果将如下所示:
W 1234 at (entry/src/main/ets/entryability/EntryAbility.ets:20:0) 具体日志内容...
复制代码
这样,你一眼就能看出日志是在哪个文件的哪一行产生的。并可以点击这行日志,快速的跳转到代码指定位置。
如何开发
首先,我们需要定义一个名为UStack的类,该类的主要功能是从堆栈信息中提取并裁剪出我们需要的部分。
// UStack.tsexport class UStack{
public static getStackClassInfo(pos :number,l:number):string|null{ try { // 创建一个新的错误对象来获取栈信息 const error = new Error(); const stack = error.stack || ''; // 确保stack存在
const lines = stack.split('\n'); // 按照换行符分割栈信息
if(lines.length>pos){ let line = lines[pos]; const parts = line.split(':'); if (parts.length > 2) { let partleft = parts[0]; let left = partleft.indexOf('(') partleft = partleft.substring(left,partleft.length) // 重新组合行信息 line = "at " + partleft + ':' + l.toString() + ':0)'; return line; } } } catch (e) { // 处理任何可能出现的错误 console.error('Error while processing stack trace:', e); } return null; }
}
复制代码
使用方法
接下来,我们可以封装一个日志方法,用于打印带有位置信息的日志。
// Log.tsclass Log { /** * 打印带有位置信息的警告日志 * @param customLine 自定义的行号(通常与打印日志的代码行相同) * @param tag 日志标签 * @param args 日志内容 */ public static warnToLoc(customLine: number, tag: string, ...args: any[]): void { const stackInfo = UStack.getStackClassInfo(2,line); if (stackInfo) { args.unshift(stackInfo); // 将位置信息添加到参数列表的最前面 } console.warn(tag, ...args); // 使用console.warn打印日志 }}
复制代码
使用示例:在你的代码中,只需要调用Log.warnToLoc方法,并传入自定义的行号、标签和日志内容即可。
Log.warnToLoc(17, "abc", "wwwwww"); // 假设这行代码位于文件的第17行
复制代码
注意:由于 JavaScript(以及鸿蒙的 ETS)在编译后可能会改变代码的结构,导致行号与实际位置不匹配。因此,这里的customLine参数需要手动指定为调用warnToLoc的代码所在的行号。目前尚没有一种方法可以完全自动地获取到准确的行号。
评论