日志管理

更新时间:2024-01-05 10:15:04下载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;
}

上传日志

上传日志是把本地保存的日志文件上传到涂鸦 IoT 开发平台,当设备出现异常时,设备日志有助于更好地定位和解决问题。

如果把所有日志都保存到文件,那么随时间推移文件会越来越大,最终导致设备存储空间不足。

建议设备预留一定的空间(如 2 MB 持久化存储区)来保存日志,为了节省空间,可以对日志文件进行切片处理。当内存文件超过一定大小(如 128 KB / 256 KB 等),则把该日志文件进行压缩备份。当所有的日志文件总大小超过一定的阈值,则把时间最早的备份文件删除,腾出空间存储新日志。

TuyaOS 支持两种上传日志的方式,分别是 平台触发用户触发

平台触发

平台触发的日志上传功能是指,通过涂鸦运营平台触发设备上传日志。触发时要求设备在线,当设备处于离线状态时该功能不可用。

平台触发使用 tuya_iot_reg_gw_app_cb 接口注册获取日志的回调函数,在回调函数中执行日志文件压缩操作,并将压缩文件的完整路径准确地通知 TuyaOS,TuyaOS 会把文件上传到涂鸦 IoT 开发平台。

使用示例:

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 界面启动日志上传流程。

  • 当设备处于在线状态时,日志文件将由设备直接上传至涂鸦 IoT 开发平台。
  • 而在设备离线但局域网与 App 保持连通的情况下,日志文件则经由 App 转发至涂鸦 IoT 开发平台,确保设备处于异常时也能够上传日志。

此功能有效解决了因设备异常离线而无法实时上传日志的问题,鉴于其灵活性和实用性,涂鸦强烈建议采用此上传方式

用户触发使用 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);

    ...
}

上传日志步骤

上传日志的步骤如下:

  1. 进入 App 的网关面板,单击右上角的 编辑 图标。

    日志管理
  2. 单击 检查设备网络

    日志管理
  3. 等待网络检查完成后,单击 上传日志

    日志管理

下载日志步骤

下载日志的步骤如下:

  1. 登录 涂鸦 IoT 开发平台,单击侧边栏的 产品 > 设备 > 设备管理,进入 设备管理页面

    日志管理
  2. 通过设备 ID,找到要下载日志的设备,单击 详情

    日志管理
  3. 在设备详情页面最下面的 设备本地日志文件,单击 下载

    日志管理