更新时间:2024-06-25 06:04:00下载pdf
TuyaOS 提供分级别的日志记录功能,您可以自由选择输出媒介(串口、文件、终端、网络等)。同时,涂鸦运营平台支持远程获取设备本地日志,遇到线上问题可以通过分析设备本地日志来排查问题。
设备本地日志功能是 IoT 网关产品的一个关键功能,日志记录了异常的现场,为分析问题提供关键线索,建议您在网关产品上使用该功能。
TuyaOS 只负责日志输出的消息格式化,提供了 TuyaOS Kernel 标准接口 tkl_output.h
,由应用来实现通过具体的媒介输出日志的内容。
TuyaOS 的默认输出终端是调用 tkl_log_output
接口,应用需要在该接口中实现日志输出功能。
例如:
把日志打印到终端:
VOID_T tkl_log_output(IN CONST CHAR_T *str, ...)
{
printf("%s", str);
fflush(stdout);
return;
}
把日志保存到文件:
VOID_T tkl_log_output(IN CONST CHAR_T *str, ...)
{
uFILE * fp = NULL;
// 打开文件
fp = ufopen("log.txt", "w+");
if(NULL == fp) {
return ;
}
// 写入文件
uiWriteCnt = ufwrite(fp, str, strlen(str));
if(uiWriteCnt != strlen(str)) {
TAL_PR_ERR("log uf file write data error!");
return ;
}
// 关闭文件
ufclose(fp);
return;
}
运行 TuyaOS 之后,您可以调用 tal_log_set_manage_attr
接口设置日志输出阈值,小于或等于设置的阈值都会被输出,输出等级定义如下:
宏定义 | 说明 |
---|---|
TAL_LOG_LEVEL_ERR | 输出阈值为错误日志 |
TAL_LOG_LEVEL_WARN | 输出阈值为警告日志 |
TAL_LOG_LEVEL_NOTICE | 输出阈值为通知日志 |
TAL_LOG_LEVEL_INFO | 输出阈值为信息日志 |
TAL_LOG_LEVEL_DEBUG | 输出阈值为调试日志 |
TAL_LOG_LEVEL_TRACE | 输出阈值为跟踪日志 |
使用示例:
#include "tal_log.h"
int main(int argc, char **argv)
{
OPERATE_RET rt = OPRT_OK;
// 初始化 TuyaOS
TUYA_CALL_ERR_RETURN(tuya_iot_init("./"));
// 日志等级设置为调试
tal_log_set_manage_attr(TAL_LOG_LEVEL_DEBUG);
// ...
return 0;
}
TuyaOS 提供了日志输出接口,您可以调用日志输出接口输出应用的日志,以便统一管理输出日志。
宏定义 | 说明 |
---|---|
PR_DEBUG | 输出调试日志 |
PR_DEBUG_RAW | 输出调试日志(未格式化的 RAW 消息) |
PR_ERR | 输出错误日志 |
PR_WARN | 输出警告日志 |
PR_INFO | 输出信息日志 |
PR_TRACE | 输出跟踪日志 |
使用示例:
VOID test_log(VOID)
{
BYTE_T test_buf[8] = {0};
tal_log_set_manage_attr(TAL_LOG_LEVEL_TRACE);
PR_TRACE("This is a trace message");
tal_log_set_manage_attr(TAL_LOG_LEVEL_DEBUG);
PR_DEBUG("This is a debug message");
PR_ERR("This is an error message");
PR_WARN("This is a warning message");
PR_INFO("This is an info message");
PR_DEBUG("PR_DEBUG_RAW:");
for (INT_T i = 0; i < sizeof(test_buf); i++) {
PR_DEBUG_RAW("%02x ", test_buf[i]);
}
PR_DEBUG_RAW("\r\n");
return;
}
上传日志是把本地保存的日志文件上传到涂鸦开发者平台,当设备出现异常时,设备日志有助于更好地定位和解决问题。
如果把所有日志都保存到文件,那么随时间推移文件会越来越大,最终导致设备存储空间不足。
建议设备预留一定的空间(如 2 MB 持久化存储区)来保存日志,为了节省空间,可以对日志文件进行切片处理。当内存文件超过一定大小(如 128 KB / 256 KB 等),则把该日志文件进行压缩备份。当所有的日志文件总大小超过一定的阈值,则把时间最早的备份文件删除,腾出空间存储新日志。
TuyaOS 支持两种上传日志的方式,分别是 平台触发 和 用户触发。
平台触发的日志上传功能是指,通过涂鸦运营平台触发设备上传日志。触发时要求设备在线,当设备处于离线状态时该功能不可用。
平台触发使用 tuya_iot_reg_gw_app_cb
接口注册获取日志的回调函数,在回调函数中执行日志文件压缩操作,并将压缩文件的完整路径准确地通知 TuyaOS,TuyaOS 会把文件上传到涂鸦开发者平台。
使用示例:
STATIC VOID __gw_log_path_cb(OUT CHAR_T *path, IN CONST INT_T len)
{
CHAR_T cmd[128] = {0};
snprintf(cmd, SIZEOF(cmd), "cp -fr /tmp/tuya.log ./log_dir/; tar zcvf /tmp/tuya_log.tgz ./log_dir/*");
system(cmd);
strncpy(path, "/tmp/tuya_log.tgz", len);
}
VOID test_get_log_file(VOID)
{
TY_GW_APP_CBS_S __gw_app_cbs = {
.gw_log_path_cb = __gw_log_path_cb,
};
tuya_iot_reg_gw_app_cb(&__gw_app_cbs);
}
用户触发的日志上传功能是指,用户通过 App 界面启动日志上传流程。
此功能有效解决了因设备异常离线而无法实时上传日志的问题,鉴于其灵活性和实用性,涂鸦强烈建议采用此上传方式。
用户触发使用 tuya_log_upd_set_cb
接口注册获取日志的回调函数,类似于平台触发的方式,在回调函数中执行日志文件压缩操作,并将压缩文件的完整路径准确地通知 TuyaOS。
tuya_log_upd_set_cb
接口要在 tuya_iot_init
接口之后调用。
使用示例:
STATIC OPERATE_RET __log_upg_get_name_cb(CHAR_T *log_name, UINT_T max_name_len)
{
PR_DEBUG("log upd get name");
CHAR_T cmd[128] = {0};
snprintf(cmd, SIZEOF(cmd), "cp -fr /tmp/tuya.log ./log_dir/; tar zcvf /tmp/tuya_log.tgz ./log_dir/*");
system(cmd);
strncpy(log_name, "/tmp/test_log.tgz", max_name_len);
return OPRT_OK;
}
STATIC VOID __log_upg_fin_cb(VOID)
{
PR_DEBUG("log upd finished");
}
int main(int argc, char **argv)
{
TY_LOG_UPD_CB_S log_upg_cbs = {
.get_name = __log_upg_get_name_cb,
.fin_upd = __log_upg_fin_cb,
};
tuya_iot_init("./");
tuya_log_upd_set_cb(&log_upg_cbs);
...
}
上传日志的步骤如下:
进入 App 的网关面板,单击右上角的 编辑 图标。
单击 检查设备网络。
等待网络检查完成后,单击 上传日志。
下载日志的步骤如下:
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈