日志管理

更新时间:2024-12-11 07:30:41下载pdf

TuyaOS 提供分级别的日志记录功能,您可以自由选择输出媒介(串口、文件、终端、网络等)。同时,涂鸦运营平台支持远程获取设备本地日志,遇到线上问题可以通过分析设备本地日志来排查问题。

设备本地日志功能是 IPC 产品的一个关键功能,日志记录了异常的现场,为分析问题提供关键线索,建议您在 IPC 产品上使用该功能。

日志管理

适配日志接口

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, ...)
    {
    	FILE * fp = NULL;
    
    	// 打开文件
    	fp = fopen("log.txt", "w+");
    	if(NULL == fp) {
    		return ;
    	}
    
    	// 写入文件
    	size_t WriteCnt = fwrite(str, sizeof(char), strlen(str), fp);
    
    	// 关闭文件
    	fclose(fp);
    
    	return;
    }
    

设置输出等级

运行 TuyaOS 之后,您可以调用 tuya_ipc_set_log_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 ret = OPRT_OK;

	// 初始化 TuyaOS
	ret = tuya_ipc_init_sdk(&env);

	// 日志等级设置为调试
	tuya_ipc_set_log_attr(TAL_LOG_LEVEL_DEBUG, NULL);

	// ...

	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};
        tuya_ipc_set_log_attr(TAL_LOG_LEVEL_TRACE, NULL);
	PR_TRACE("This is a trace message");

        tuya_ipc_set_log_attr(TAL_LOG_LEVEL_DEBUG, NULL);
	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");

        tuya_ipc_set_log_attr(PR_DEBUG_RAW, NULL);
	for (INT_T i = 0; i < sizeof(test_buf); i++) {
		PR_DEBUG_RAW("%02x ", test_buf[i]);
	}
	PR_DEBUG_RAW("\r\n");

    return;
}

上传日志

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

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

平台触发

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

平台触发使用 cloud_operation_set_log_path_cb 或者 cloud_operation_set_log_path_and_fin_cb 接口注册获取日志的回调函数,在回调函数中将日志完整路径准确地通知 TuyaOS,TuyaOS 会把文件上传到涂鸦开发者平台。若需要在日志上传后,做后续的操作,例如删除日志文件,可以使用 cloud_operation_set_log_path_and_fin_cb 接口注册日志获取后的回调函数。

使用示例:

STATIC VOID __sdk_log_path_cb(OUT CHAR_T *path, IN CONST INT_T len)
{
    strncpy(path, "/tmp/test.log", len);
}

//非必须
STATIC VOID __sdk_log_finish_cb(OUT CHAR_T *path, IN CONST INT_T len)
{
	remove("/tmp/test.log");
}

VOID test_get_log_file(VOID)
{
        //若不需要在日志上传成功后有后续的操作,则使用此api
	cloud_operation_set_log_path_cb(__sdk_log_path_cb);
	
	//若需要在日志上传成功后有后续的操作,则使用此api
	cloud_operation_set_log_path_and_fin_cb(__sdk_log_path_cb, __sdk_log_finish_cb);
}

循环覆盖的方案有很多。例如,可以在设备预留一定的空间(如 2 MB 持久化存储区)来保存日志。为了节省空间,可以对日志文件进行切片处理。当内存文件超过一定大小(如 128 KB / 256 KB 等),则把该日志文件进行压缩备份。当所有的日志文件总大小超过一定的阈值,则把时间最早的备份文件删除,腾出空间存储新日志。
也可以在 tkl_log_output 把日志保存到循环缓存区中。当平台触发日志上传功能时,把缓冲区的数据写到 Flash。