日志服务

更新时间:2023-12-19 08:36:58下载pdf

设备日志可以记录设备的运行状态,及时记录问题点以及关键信息,方便开发人员调试以及定位问题。

功能描述

  • 支持动态自定义输出方式,例如自定义输出到终端、文件、串口、485 等。
  • 支持动态设置打印级别。
  • 支持按模块分级别打印。
  • 支持 HEX 模式打印。
  • 日志内容包含日志级别、文件、行号、时间戳信息。
  • 日志输出被设计为线程安全的方式。即日志输出接口带锁,多线程并行执行日志输出时,数据不会混乱。

开发指导

运行环境

由于每个模组上的资源不一样,并不会打开所有功能,您需要检查 tuya_iot_config.h 确认如下宏定义是否定义:

#define ENABLE_LOG 1

关联头文件

  • tal_log.h

调用顺序

日志输出接口需要在 系统服务初始化 接口之后调用。

API 说明

默认模块日志输出

宏函数 说明
TAL_PR_TRACE (fmt, …) 追踪日志
TAL_PR_DEBUG (fmt, …) 调试日志,固件开发或者排查问题时的日志
TAL_PR_INFO (fmt, …) 信息日志
TAL_PR_NOTICE (fmt, …) 关键信息
TAL_PR_WARN (fmt, …) 警告日志,不太重要的、具有 可修复性 的错误时输出的日志
TAL_PR_ERR (fmt, …) 错误日志,发生严重的、不可修复 的错误时输出的日志
参数 描述
fmt 格式化参数
可变参数

默认模块 Hex 数据日志输出

宏函数 说明
TAL_PR_HEXDUMP_TRACE (title, buf, size) 追踪日志
TAL_PR_HEXDUMP_DEBUG (title, buf, size) 调试日志,固件开发或者排查问题时的日志
TAL_PR_HEXDUMP_INFO (title, buf, size) 信息日志
TAL_PR_HEXDUMP_NOTICE (title, buf, size) 关键信息
TAL_PR_HEXDUMP_WARN (title, buf, size) 警告日志,不太重要的、具有 可修复性 的错误时输出的日志
TAL_PR_HEXDUMP_ERR (title, buf, size) 错误日志,发生严重的、不可修复 的错误时输出的日志
参数 描述
title 自定义标签
buf 需要打印的缓存
size 缓存的大小

设置日志打印级别

一旦设置某个级别后,低于这个级别的日志将不再被打印

  • 最高日志级别:TAL_LOG_LEVEL_ERR 最高级别
  • 最低日志级别:TAL_LOG_LEVEL_TRACE 最低级别

该接口适用于涂鸦默认模块的打印,对您自定义添加的模块打印无效。即该设置仅作用于 TAL_PR_XXXTAL_PR_HEXDUMP_XXX 日志输出接口。

typedef enum {
    TAL_LOG_LEVEL_ERR,            //! 错误
    TAL_LOG_LEVEL_WARN,            //! 警告
    TAL_LOG_LEVEL_NOTICE,        //! 关键
    TAL_LOG_LEVEL_INFO,            //! 信息
    TAL_LOG_LEVEL_DEBUG,        //! 调试
    TAL_LOG_LEVEL_TRACE,        //! 追踪
} TAL_LOG_LEVEL_E;

/**
 * @brief set global log level.
 *
 * @param[in] curLogLevel , log level
 *
 * @note This API is used for setting global log level.
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tal_log_set_manage_attr(CONST TAL_LOG_LEVEL_E level);

增加自定义输出方式

日志经过格式化后会回调用户注册的函数,具体的实现,您可以在这个函数自行处理。可以通过该接口实现用不同输出端(网络,文件等)输出日志的功能。

typedef VOID (*TAL_LOG_OUTPUT_CB)(IN CONST CHAR_T *str);

/**
 * @brief add one output terminal.
 *
 * @param[in] name , terminal name
 * @param[in] term , output function pointer
 *
 * @note This API is used for adding one output terminal.
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tal_log_add_output_term(CONST CHAR_T *name, CONST TAL_LOG_OUTPUT_CB term);

删除自定义输出方式

/**
 * @brief delete one output terminal.
 *
 * @param[in] name , terminal name
 *
 * @note This API is used for delete one output terminal.
 *
 * @return NONE
 */
VOID tal_log_del_output_term(CONST CHAR_T *name);

增加模块打印级别

您可以新增一个模块打印,方便在不同模块设置不同打印级别,上述 TAL_PR_XXX 则属于涂鸦自带的一个模块打印

/**
 * @brief add one module's log level
 *
 * @param[in] module_name, module name
 * @param[in] logLevel, this module's log level
 *
 * @note This API is used for adding one module's log level.
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tal_log_add_module_level(CONST PCHAR_T module_name, CONST TAL_LOG_LEVEL_E level);

设置模块打印级别

/**
 * @brief add one module's log level
 *
 * @param[in] pModuleName, module name
 * @param[in] logLevel, this module's log level
 *
 * @note This API is used for adding one module's log level.
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tal_log_set_module_level(CONST PCHAR_T module_name, TAL_LOG_LEVEL_E level);

删除模块打印级别

/**
 * @brief delete one module's log level
 *
 * @param[in] pModuleName, module name
 *
 * @note This API is used for deleting one module's log level.
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
OPERATE_RET tal_log_delete_module_level(CONST PCHAR_T module_name);

自定义模块打印输出宏

日志输出宏 说明
TAL_MPR_TRACE (module, fmt, …) 追踪日志
TAL_MPR_DEBUG (module, fmt, …) 调试日志,固件开发或者排查问题时的日志
TAL_MPR_INFO (module, fmt, …) 信息日志
TAL_MPR_NOTICE (module, fmt, …) 关键信息
TAL_MPR_WARN (module, fmt, …) 警告日志,不太重要的、具有 可修复性 的错误时输出的日志
TAL_MPR_ERR (module, fmt, …) 错误日志,发生严重的、不可修复 的错误时输出的日志

常见问题

日志打印为什么不完整?

打印日志缓存大小默认 1024 Byte,超过部分不会打印。

为什么程序有时候在打印接口中卡死?

打印接口带有程序锁,故打印接口不要用在中断函数中。

在异步删除线程时,请确保打印接口已经完成调用。