JZsdk_Logger_Init.c 7.4 KB
#include "JZsdk_Logger.h"
#include "JZsdkLib.h"

#include <unistd.h>
#include <time.h>

#define JZSDK_LOG_PATH                    "/root/sdcard/JZLOG/"         //sd卡存放路径
#define JZSDK_LOG_INDEX_PATH              "/root/JZLOG/"         //sd卡存放序号文件路径
#define JZSDK_LOG_INDEX_FILE_NAME         "/root/JZLOG/thelast" //sd卡存放序号文件路径
#define JZSDK_LOG_SD_INDEX_FILE_NAME      "/root/sdcard/JZLOG/thelast" //sd卡存放序号文件路径

#define JZ_LOG_FOLDER_NAME_MAX_SIZE    (32)
#define JZ_LOG_MAX_COUNT               (10)
#define JZ_SYSTEM_CMD_STR_MAX_SIZE     (64)
#define JZSDK_LOG_MAX_COUNT 20

#define LOG_GRADE JZSDK_LOGGER_CONSOLE_LOG_LEVEL_INFO   //日志等级!


/* 全局变量 ------------------------------------------------------------------*/
static struct timeval g_start_time;
static FILE *logFile = NULL;
static FILE *logFileCnt = NULL;
static int Logger_init_flag = JZ_FLAGCODE_OFF;

/* 函数声明 ------------------------------------------------------------------*/


static T_JZsdkReturnCode createJZLOGFolder() 
{
    // 使用系统命令检测路径是否存在
    if(JZsdk_check_directory_exists_posix(JZSDK_LOG_PATH) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZsdk_Osal_Mkdir(JZSDK_LOG_PATH);
    }

    if(JZsdk_check_directory_exists_posix(JZSDK_LOG_INDEX_PATH) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZsdk_Osal_Mkdir(JZSDK_LOG_INDEX_PATH);
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}



static T_JZsdkReturnCode JzUser_PrintConsole(const JZ_U8 *data, JZ_U16 dataLen)
{
    dataLen = dataLen;

    printf("%s", data);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

static T_JZsdkReturnCode JzUser_LocalWrite(const JZ_U8 *data, JZ_U16 dataLen)
{
    JZ_U32 realLen;

    if (logFile == NULL) 
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    realLen = fwrite(data, 1, dataLen, logFile);
    fflush(logFile);
    if (realLen == dataLen) 
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    } 
    else 
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
}

static T_JZsdkReturnCode JzUser_LocalWriteFsInit(const JZ_U8 *path)
{
    JZ_U8 filePath[JZSDK_FILE_PATH_SIZE_MAX];
    JZ_U8 systemCmd[JZ_SYSTEM_CMD_STR_MAX_SIZE];
    JZ_U8 folderName[JZ_LOG_FOLDER_NAME_MAX_SIZE];
    time_t currentTime = time(NULL);
    struct tm *localTime = localtime(&currentTime);
    uint16_t logFileIndex = 0;
    uint16_t currentLogFileIndex;
    uint8_t ret;


    if (localTime == NULL) 
    {
        printf("Get local time error.\r\n");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    //1、检查sd卡的计数文件是否存在, 如果不存在,则移除系统的计数文件
    if (JZsdk_check_file_exists(JZSDK_LOG_SD_INDEX_FILE_NAME) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        memset(systemCmd, 0, sizeof(systemCmd));
        sprintf(systemCmd, "rm -f %s", JZSDK_LOG_INDEX_FILE_NAME);
        ret = system(systemCmd);
    }
    
    //2、打开计数文件,获取当前日志文件序号,并更新日志文件序号
    logFileCnt = fopen(JZSDK_LOG_INDEX_FILE_NAME, "rb+");
    if (logFileCnt == NULL) 
    {
        logFileCnt = fopen(JZSDK_LOG_INDEX_FILE_NAME, "wb+");
        if (logFileCnt == NULL) 
        {
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        }
    } 
    else 
    {
        ret = fseek(logFileCnt, 0, SEEK_SET);
        if (ret != 0) 
        {
            printf("Seek log count file error.\r\n");
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        }

        ret = fread((uint16_t *) &logFileIndex, 1, sizeof(uint16_t), logFileCnt);
        if (ret != sizeof(uint16_t)) 
        {
            printf("Read log file index error.\r\n");
        }
    }

    currentLogFileIndex = logFileIndex;
    logFileIndex++;

    ret = fseek(logFileCnt, 0, SEEK_SET);
    if (ret != 0) {
        printf("Seek log file error, ret: %d\r\n", ret);
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    ret = fwrite((uint16_t *) &logFileIndex, 1, sizeof(uint16_t), logFileCnt);
    if (ret != sizeof(uint16_t)) {
        printf("Write log file index error.\r\n");
        fclose(logFileCnt);
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    fclose(logFileCnt);

    //移除sd卡的计数文件
    memset(systemCmd, 0, sizeof(systemCmd));
    sprintf(systemCmd, "rm -f %sthelast", JZSDK_LOG_PATH);
    ret = system(systemCmd);
    if (ret != 0) {
        JZSDK_LOG_ERROR("Remove file error, ret:%d.\r\n", ret);
    }

    //复制日志计数文件到sd卡
    memset(systemCmd, 0, sizeof(systemCmd));
    sprintf(systemCmd, "cp %s %s", JZSDK_LOG_INDEX_FILE_NAME, JZSDK_LOG_PATH);
    ret = system(systemCmd);
    if (ret != 0) {
        JZSDK_LOG_ERROR("Copy file error, ret:%d.\r\n", ret);
    }

    //开始打开log文件
    sprintf(filePath, "%s_%04d_%04d%02d%02d_%02d-%02d-%02d.log", path, currentLogFileIndex,
            localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
            localTime->tm_hour, localTime->tm_min, localTime->tm_sec);

    logFile = fopen(filePath, "wb+");
    if (logFile == NULL) {
        JZSDK_LOG_ERROR("Open filepath time error.");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    if (logFileIndex >= JZ_LOG_MAX_COUNT) 
    {
        //把多余的日志删除
        sprintf(systemCmd, "rm -rf %s_%04d*.log", path, currentLogFileIndex - JZ_LOG_MAX_COUNT);
        ret = system(systemCmd);
        if (ret != 0) {
            printf("Remove file error, ret:%d.\r\n", ret);
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        }    
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_JZsdkReturnCode JZsdk_LoggerInit()
{
    T_JZsdkReturnCode ReturnCode;
    unsigned int logFileIndex = 0;
    unsigned int currentLogFileIndex;


    T_JZsdkLoggerConsole printfConsole = {
        .func = JzUser_PrintConsole,
        .consoleLevel = JZSDK_LOGGER_CONSOLE_LOG_LEVEL_DEBUG,
        .isSupportColor = true,
    };

    T_JZsdkLoggerConsole localRecordConsole = {
        .func = JzUser_LocalWrite,
        .consoleLevel = JZSDK_LOGGER_CONSOLE_LOG_LEVEL_INFO,
        .isSupportColor = true,
    };

    //1、检测日志文件夹是否存在,不存在则创建
    ReturnCode = createJZLOGFolder();
    if(ReturnCode != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        printf("createJZLOGFolder error\n");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    ReturnCode = JzUser_LocalWriteFsInit(JZSDK_LOG_PATH); 
    if(ReturnCode != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 
    {
        printf("file system init error\n");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    ReturnCode = JZsdk_Logger_AddPrintConsole(&printfConsole);
    if (ReturnCode != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        printf("JZsdk Logger AddPrintConsole error\n");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    ReturnCode = JZsdk_Logger_AddRecordConsole(&localRecordConsole);
    if (ReturnCode != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        printf("JZsdk Logger AddRecordConsole error\n");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    //设立监控
    JZsdk_Log_Monitor_Init();
    
    JZSDK_LOG_INFO("Log init success.");

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_JZsdkReturnCode JZsdk_LoggerDeInit()
{
    if (logFile != NULL)
    {
        fclose(logFile);
        logFile = NULL;
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}