104 lines
2.9 KiB
C++

#include "SH_log.h"
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <stdarg.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include "../common/SH_global.h"
#include "../common/SH_CommonFunc.hpp"
struct _LogParam {
pthread_mutex_t *m_mutex;
int m_limit_size;
int m_log_buf_size;
int m_today;
FILE *m_fp;
char m_log_full_name[256];
char *m_buf;
} gLogParam;
int log_init(const char* file_name, int log_buf_size, int limit_size)
{
memset(gLogParam.m_log_full_name, 0, 256);
gLogParam.m_mutex = new pthread_mutex_t;
pthread_mutex_init(gLogParam.m_mutex, NULL);
gLogParam.m_log_buf_size = log_buf_size;
gLogParam.m_buf = new char[gLogParam.m_log_buf_size];
memset(gLogParam.m_buf, '\0', sizeof(char) * gLogParam.m_log_buf_size);
gLogParam.m_limit_size = limit_size;
struct timeval now = {0,0};
gettimeofday(&now, NULL);
time_t t ;
t = now.tv_sec;
struct tm* sys_tm = localtime(&t);
char fileTime[20]={0x00};
char fileName[100]={0x00};
int n = snprintf(fileTime, 64, "%d-%02d-%02d.log", sys_tm->tm_year+1900, sys_tm->tm_mon+1, sys_tm->tm_mday);
sprintf(fileName,"%s%s",file_name,fileTime);
strcpy(gLogParam.m_log_full_name, fileName);
return 0;
}
void log_write(const char *level, const char* format, ...)
{
struct timeval now = {0,0};
gettimeofday(&now, NULL);
time_t t;
t = now.tv_sec;
struct tm* sys_tm = localtime(&t);
char fileTime[20]={0x00};
char fileName[100]={0x00};
int n = snprintf(fileTime, 64, "%d-%02d-%02d.log", sys_tm->tm_year+1900, sys_tm->tm_mon+1, sys_tm->tm_mday);
sprintf(fileName,"%s%s",SOFTWARE_RUN_LOG,fileTime);
strcpy(gLogParam.m_log_full_name, fileName);
FILE *fp = fopen(gLogParam.m_log_full_name, "a");
if(fp == NULL) {
return;
}
memset(gLogParam.m_buf, 0, sizeof(char)*gLogParam.m_log_buf_size);
pthread_mutex_lock(gLogParam.m_mutex);
n = snprintf(gLogParam.m_buf, 64, "%d-%02d-%02d %02d:%02d:%02d %s: ", sys_tm->tm_year+1900, sys_tm->tm_mon+1, sys_tm->tm_mday,
sys_tm->tm_hour, sys_tm->tm_min, sys_tm->tm_sec, level);
int old_seek = ftell(fp);
fseek(fp, 0, SEEK_END);
int file_size = ftell(fp);
fseek(fp, old_seek, SEEK_SET);
if (file_size > gLogParam.m_limit_size) {
fclose(fp);
char cmd[256] = { 0 };
sprintf(cmd, "cp %s %s_bak", gLogParam.m_log_full_name, gLogParam.m_log_full_name);
system(cmd);
remove(gLogParam.m_log_full_name);
fp = fopen(gLogParam.m_log_full_name, "a");
if(fp == NULL) {
return;
}
}
va_list valst;
va_start(valst, format);
int m = vsnprintf(gLogParam.m_buf + n, gLogParam.m_log_buf_size -n -1, format, valst);
gLogParam.m_buf[n + m - 1] = '\n';
fwrite(gLogParam.m_buf, n + m, 1, fp);
va_end(valst);
fclose(fp);
pthread_mutex_unlock(gLogParam.m_mutex);
}