/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2023-06-16 murmur the first version */ #include #include <..\rt-thread\components\utilities\ulog\backend\ulog_be.h> #include "usrcfg.h" /* * 后端注册表 */ struct _log_file { char *name; //文件名 ulog_backend_t backend; struct ulog_file_be *file_be; const char *dir_path; //保存路径 rt_size_t max_num; //保存最大文件数量 rt_size_t max_size; //保存最大文件大小 rt_size_t buf_size; //文件保存缓存大小 }; /* * 文件后端标识 */ typedef enum { console_id, sys_id, motion_id, }ulog_file_be_name; #define ROOT_PATH ROOT_PATH_DEBUG //设置保存路径 #define FILE_SIZE 100*1024 //设置单个文件大小 #define BUFF_SIZE 1*1024 //设备缓存区大小 static struct ulog_backend sys_log_backend; static struct ulog_file_be sys_log_file; extern char *getTimestmp(char *str); static struct _log_file table[] = { {"motion" ,&sys_log_backend,&sys_log_file,ROOT_PATH,5,FILE_SIZE,BUFF_SIZE}, {"sys" ,&sys_log_backend,&sys_log_file,ROOT_PATH,10,FILE_SIZE,BUFF_SIZE}, }; /* Private function prototypes -----------------------------------------------*/ /** * @brief 系统日志文件后端滤波器设置. * @param None. * @retval The filter will be call before output. It will return TRUE when the filter condition is math. * @note None. */ static rt_bool_t sys_log_file_backend_filter(struct ulog_backend *backend, rt_uint32_t level, const char *tag, rt_bool_t is_raw, const char *log, rt_size_t len) { //设置滤波规则,可以自己编写代码实现不同滤波规则 // if (rt_strncmp(tag,"MOVE", sizeof(MOTION_TAG)) == 0)//排除带有"MOVE"标签输出 // return RT_FALSE; // else // return RT_TRUE; if (level < LOG_LVL_DBG)//"DEBUG" return RT_TRUE; else return RT_FALSE; } /** * @brief 系统日志文件后端初始化. * @param None. * @retval None. * @note None. */ static char logfilename[50];// = "2023-08-27/2023-08-27#11-"; static char tmstr[50];//定义时间前缀 static void sys_log_file_backend_init(void) { static struct ulog_file_be *file_be = &sys_log_file; uint8_t id = sys_id; file_be->parent = sys_log_backend; // char logfilename[50];// = "2023-08-27/2023-08-27#11-"; // char tmstr[50];//定义时间前缀 memset(logfilename,0,50); memset(tmstr,0,50); getTimestmp(tmstr);// 2023-08-27 11-44-42-65 tmstr[10]='#';//2023-08-27#11- tmstr[14]='\0'; //以天为独立文件夹 strncpy(logfilename,tmstr,10); char dir[30]=ROOT_PATH; mkdir(dir, 0);//sd/debug rt_thread_mdelay(100); strcat(dir,"/"); strcat(dir,logfilename);//sd/debug/2023-08-27 // LOG_D("dir=%s",dir); mkdir(dir, 0); rt_thread_mdelay(100); strcat(logfilename,"/"); // LOG_D("f=%s",logfilename); //总路径不能太长 strcat(logfilename,tmstr+11);//sd/debug/2023-09-03/11- // LOG_D("f=%s",tmstr); // LOG_D("f=%s",logfilename); // ulog_file_backend_deinit(file_be); ulog_file_backend_disable(file_be); //先关闭 ulog_file_backend_deinit(file_be); ulog_file_backend_init( file_be, strcat(logfilename,table[id].name), table[id].dir_path, table[id].max_num, table[id].max_size, table[id].buf_size); ulog_file_backend_enable(file_be); //必须使能才能有效 //新增代码 ulog_backend_filter_t filter = sys_log_file_backend_filter; // ulog_backend_set_filter(&file_be->parent,filter); } static int isToUpdate = 1; static void sys_log_init_thread_entry(void *parameter) { while (1) { if(isToUpdate) { isToUpdate = 0; sys_log_file_backend_init(); } rt_thread_mdelay(30*1000); } } static void initLogFileBackend() { /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("updateLogName", sys_log_init_thread_entry, RT_NULL, 1024*5, 29, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { LOG_E("failed to create 'updateLogName'"); } } /** * 更新debug日志的文件名 */ void updateDebuglogName(void) { // rt_mutex_release(updateLogName); isToUpdate = 1; } //MSH_CMD_EXPORT(updateDebuglogName,更新debug日志的文件名); MSH_CMD_EXPORT(initLogFileBackend,initLogFileBackend); INIT_APP_EXPORT(initLogFileBackend);