TuyaOS
日志服务

TuyaOS提供按照模块、分级别的日志记录能力,开发者可以根据自己的需求,选择合适的日志级别进行日志记录输出,同时也可以设置默认输出的日志级别,控制只输出默认输出日志级别以上的日志。TuyaOS的日志模块,支持灵活的添加输出的出口,开发者可以根据自己的需求,将日志输出到串口、文件或者是网络上。

TuyaOS同时也支持在线日志的模式,开发者可以在涂鸦IoT平台上,通过设备命令,设置日志的级别和输出出口,如果输出出口是MQTT,并且网络正常,客户即可在涂鸦IoT平台上看到设备日志信息。

日志级别信息

typedef enum {
TAL_LOG_LEVEL_ERR, // error
TAL_LOG_LEVEL_WARN, // warning
TAL_LOG_LEVEL_NOTICE, // notice
TAL_LOG_LEVEL_INFO, // information
TAL_LOG_LEVEL_DEBUG, // debug
TAL_LOG_LEVEL_TRACE, // detail trace
} TAL_LOG_LEVEL_E;

TuyaOS 定义了6个日志级别,其中TAL_LOG_LEVEL_INFO,TAL_LOG_LEVEL_DEBUG,TAL_LOG_LEVEL_TRACE在发布固件中默认不可见,但可以通过接口设置日志级别而恢复输出。

接口描述

日志输出宏

// log output
TAL_PR_ERR(fmt, ...) // error
TAL_PR_WARN(fmt, ...) // warnning
TAL_PR_NOTICE(fmt, ...) // notice
TAL_PR_INFO(fmt, ...) // information
TAL_PR_DEBUG(fmt, ...) // debug
TAL_PR_TRACE(fmt, ...) // detail trace
// data dump
TAL_PR_HEXDUMP_ERR(title, buf, size) // error
TAL_PR_HEXDUMP_WARN(title, buf, size) // warnning
TAL_PR_HEXDUMP_NOTICE(title, buf, size) // notice
TAL_PR_HEXDUMP_INFO(title, buf, size) // information
TAL_PR_HEXDUMP_DEBUG(title, buf, size) // debug
TAL_PR_HEXDUMP_TRACE(title, buf, size) // detail trace

添加日志output

// prototype of log output function
typedef VOID (*LOG_OUTPUT)(IN CONST CHAR_T *str);
OPERATE_RET tal_log_add_output_term(CONST CHAR_T *name, CONST TAL_LOG_OUTPUT_CB term);

此接口可以自定义一个输出终端,需要自己按照LOG_OUTPUT原型实现一个接口,并且添加到日志服务。后续日志输出会额外新增一个输出接口(原来的输出方式会继续保留)。

删除日志output

VOID tal_log_del_output_term(CONST CHAR_T *name);

此接口用于删除通过接口tal_log_add_output_term设置的日志输出终端。

设置日志输出级别

OPERATE_RET tal_log_set_manage_attr(CONST TAL_LOG_LEVEL_E level);

此接口用于设置默认的日志输出级别。设置日志级别可以控制日志输出,如果需要输出的日志级别小于当前的日志级别,则可以输出;否则,则不会输出。

获取日志输出级别

OPERATE_RET tal_log_get_log_manage_attr(TAL_LOG_LEVEL_E *level);

此接口用于获取默认的日志输出级别。

使用示例

// 一个把日志记录到文件的日志输出接口
VOID log_output_to_file(IN CONST CHAR_T *str)
{
uFILE * fp = NULL;
fp = ufopen("log", "w+");
if(NULL == fp) {
PR_ERR("log uf file can't open and write data!");
return ;
}
uiWriteCnt = ufwrite(fp, str, strlen(str));
if(uiWriteCnt != strlen(str)) {
PR_ERR("log uf file write data error!");
return ;
}
ufclose(fp);
return;
}
// 在完成系统初始化之后调用此接口测试内存分配
VOID sample_logoutput_test()
{
// 日志级别
tal_log_set_manage_attr(TY_LOG_LEVEL_DEBUG);
TAL_PR_DEBUG("a debug log");
tal_log_set_manage_attr(TY_LOG_LEVEL_NOTICE);
TAL_PR_DEBUG("another debug log");
TAL_PR_DEBUG("an error log");
// 新增一个新的终端
tal_log_add_output_term("filelog", log_output_to_file);
TAL_PR_DEBUG("another debug log");
TAL_PR_ERR("another error log");
tal_log_del_output_term("filelog");
TAL_PR_ERR("another error log");
return;
}
uFILE * ufopen(IN CHAR_T *filepath, IN CHAR_T *mode)
open a unique file
VOID uFILE
unique file handle
Definition: tuya_uf_db.h:22
OPERATE_RET ufclose(IN uFILE *fd)
close a unique file
UINT_T ufwrite(IN uFILE *fd, IN UCHAR_T *buf, IN CONST UINT_T len)
write to unique file