更新时间: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。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈