DevEco Studio 日志建议

DevEco Studio 日志建议 控制台console.log日志打印很不好观察,当打印的日志是个对象的时候,很不好观察其结构,必须要用工具格式化才能看清楚层级关系。如果对象里的数据过多时,console.log日志会显示不全

cke_765.png

拖老长了,这边能优化一下嘛


10 回复

【解决方案】

开发者您好,可以启用Soft-Wrap功能以实现日志消息的自动换行。参考DevEco Studio中如何设置超长日志自动换行


楼主不要那么麻烦的去设置日志的打印格式,只要调整一下日志窗口的展示内容就好了,如图:

cke_1344.png

楼主可以自己构建一个日志工具类来格式化日志:

JSON.stringify(res,null,2)

自定义 MyLogger 日志打印

import std.time.*
import std.io.{OutputStream, BufferedOutputStream}
import std.console.Console
import std.time.DateTime
import log.{Logger, Attr, LogRecord, LogLevel}
import log

main() {
    // 创建一个输出到终端的 MyLogger
    let logger = MyLogger(Console.stdOut)
    logger.warn("出现了一个 warn 信息!")
    logger.log(LogLevel.ERROR, "出现了一个 ERROR 信息!")
    logger.debug("出现了一个 debug 信息!但是因为 MyLogger 的默认 LogLevel 是 DEBUG 所以这里不会输出日志~")
}

// Logger 是抽象类需要自己实现
public class MyLogger <: Logger {
    let bo: BufferedOutputStream<OutputStream>
    // 默认日志级别
    var _level = LogLevel.INFO
    public init(output: OutputStream) {
        bo = BufferedOutputStream<OutputStream>(output)
    }
    public mut prop level: LogLevel {
        get() {
            _level
        }
        set(v) {
            _level = v
        }
    }
    public func withAttrs(attrs: Array<Attr>): Logger {
        return this
    }
    public func log(level: LogLevel, message: String, attrs: Array<Attr>): Unit {
        if (this.enabled(level)) {
            let record: LogRecord = LogRecord(DateTime.now(), level, message, attrs)
            log(record)
        }
    }
    public func log(level: LogLevel, message: () -> String, attrs: Array<Attr>): Unit {
        if (this.enabled(level)) {
            let record: LogRecord = LogRecord(DateTime.now(), level, message(), attrs)
            log(record)
        }
    }
    public func log(record: LogRecord): Unit {
        bo.write("time = ${record.time} level = ${record.level} msg = ${record.message}\n".toArray())
        bo.flush()
    }
    public func isClosed(): Bool {
        false
    }
    public func close(): Unit {
    }
}
效果
time = 2025-07-31T20:00:53.6899709+08:00 level = WARN msg = 出现了一个 warn 信息!
time = 2025-07-31T20:00:53.6900527+08:00 level = ERROR msg = 出现了一个 ERROR 信息!

解决方式:

可以点你自己的头像,看到如下图,选择“我的工单”,去提一个DevEco Studio 日志建议的工单。 cke_123.png

你好,json字符串可使用 JSON.stringify 来美化打印,通过第三个参数控制缩进空格。

// 美化打印(缩进 2 个空格,推荐)
console.log(JSON.stringify(user, null, 2));
/* 输出:
{
  "name": "张三",
  "age": 25,
  "address": {
    "city": "北京"
  }
}
*/

小伙伴你好,可以使用三方库。

推荐使用: https://ohpm.openharmony.cn/#/cn/detail/@abner%2Flog

此三方库还支持对应代码段的跳转 harmonyos_log_view0.jpg harmonyos_log_view1.png

DevEco Studio日志功能提供应用运行时的详细记录,包括系统事件、错误信息和性能数据。日志级别分为Verbose、Debug、Info、Warn、Error,可通过HiLog API输出。在Log窗口查看实时日志,支持按进程、标签和级别过滤。日志文件存储在设备的/data/log/目录下,可使用hdc命令导出分析。

针对DevEco Studio中console.log打印对象可读性差的问题,目前确实存在。这主要是由于控制台默认以字符串形式展开复杂对象,而非提供交互式树状视图。

核心原因与现状:

  1. 默认行为:DevEco Studio的控制台(基于IntelliJ平台)对console.log输出的对象,默认采用toString()或类似方式渲染,导致嵌套结构被压缩成一行,难以阅读。
  2. 数据截断:长字符串或大对象在控制台输出时会被截断,这是平台为防止控制台过载的默认限制。

现有解决方案(非官方优化,但可立即使用):

  • 使用JSON.stringify()格式化
    在打印时手动格式化,可以清晰展示层级。
    console.log(JSON.stringify(yourObject, null, 2)); // 缩进2空格
    
  • 使用多个console.log
    对大型对象,可分属性打印。
  • 使用console.dir()(如支持)
    部分运行环境可能支持以交互式树状结构显示对象,但依赖运行时环境支持。

建议的优化方向(供开发团队参考):

  1. 增强控制台对象渲染器
    为ArkTS/JavaScript对象实现交互式树状视图,支持展开/折叠节点,类似Chrome DevTools。
  2. 提供日志格式化开关
    在控制台设置中增加选项,允许自动格式化对象输出。
  3. 优化截断策略
    提供可配置的截断长度,或允许点击展开完整内容。

当前,推荐使用JSON.stringify()作为临时解决方案,以提升日志可读性。希望未来版本能原生支持更友好的对象调试输出。

回到顶部