⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logger.c

📁 日志模块
💻 C
字号:
#include "Logger.h"static int bSwitch = 0;static int bStarted = 0;static LOG_LIST log_list;static pthread_t tid = 0;static CFG cfg;static void TrimChar (char *ptr, char c);static void *Worker (void *arg);static void *Gzip (void *arg);static void *Dispose (void *arg);static void Push (LOG * log);static LOG *Pop ();static void CleanUp (void *arg);static void WakeUp (int sig);static int ReadConfig (const char *szConfig);intStartLogger (const char *szProgName){  int err = 0;  pthread_t tid;  pthread_attr_t attr;	struct sigaction act;	  if (bStarted)    return 0;  if (szProgName == NULL)    return -1;  /*初始化 */  memset (&log_list, 0, sizeof (log_list));  pthread_mutex_init (&(log_list.mtx), NULL);  if (ReadConfig (szProgName) < 0)  {    printf ("ReadConfig error!\n");    return -1;  }  if (signal (SIGUSR1, WakeUp) == SIG_ERR)  {    perror ("Set SIGUSR1 error!");    return errno;  }  /*get ride of defunct*/  sigaction(SIGCHLD, NULL, &act);  /*act.sa_handler = SIG_IGN;   sigemptyset(&act.sa_mask);*/  act.sa_flags |= SA_NOCLDWAIT;  sigaction(SIGCHLD,&act,NULL);     pthread_attr_init (&attr);  pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);  pthread_create (&tid, &attr, Worker, NULL);  if (cfg.period > 0 && cfg.compress_log > 0)  {    pthread_create (&tid, &attr, Gzip, NULL);  }  if (cfg.period > 0 && cfg.delete_log_day > 0)  {    pthread_create (&tid, &attr, Dispose, NULL);  }  pthread_attr_destroy (&attr);  printf ("Start logger service...\n");  bStarted = 1;  return 0;}intReadConfig (const char *szConfig){  FILE *fp;  char str[128];  char szConfigName[128] = {0};  int i = 0, j;  memset (&cfg, 0, sizeof (cfg));	if (getenv("LOGGER") != NULL)	{		sprintf(szConfigName, "%s/Logger.cfg", getenv("LOGGER"));	}	else	{		sprintf(szConfigName, "%s/misc/Logger.cfg", getenv("HOME"));		}		if (GetPrivateProfileString(szConfig,"LOG_PATH","",cfg.log_path, \	sizeof(cfg.log_path),szConfigName) < 0)	{		return -1;	}	TrimChar (cfg.log_path, ' ');		if (GetPrivateProfileString(szConfig,"LOG_NAME1","",cfg.log_name[i], \	sizeof(cfg.log_path),szConfigName) < 0)	{		return -1;	}	TrimChar (cfg.log_name[i], ' ');	i++;		if (GetPrivateProfileString(szConfig,"LOG_NAME2","",cfg.log_name[i], \	sizeof(cfg.log_path),szConfigName) < 0)	{		return -1;	}	TrimChar (cfg.log_name[i], ' ');	i++;	memset (str, 0, sizeof (str));	if (GetPrivateProfileString(szConfig,"LOG_PERIOD","",str, \	sizeof(str),szConfigName) < 0)	{		return -1;	}	TrimChar (str, ' ');  cfg.period = atoi(str);	memset (str, 0, sizeof (str));	if (GetPrivateProfileString(szConfig,"LOG_COMPRESS","",str, \	sizeof(str),szConfigName) < 0)	{		return -1;	}	TrimChar (str, ' ');  cfg.compress_log = atoi(str);	memset (str, 0, sizeof (str));	if (GetPrivateProfileString(szConfig,"LOG_DELETE","",str, \	sizeof(str),szConfigName) < 0)	{		return -1;	}	TrimChar (str, ' ');  cfg.delete_log_day = atoi(str);  return 0;}static voidWakeUp (int sig){  if (signal (SIGUSR1, WakeUp) == SIG_ERR)  {    perror ("Set SIGUSR1 error!");    return;  }  if (bSwitch)    bSwitch = 0;  else    bSwitch = 1;}static voidPush (LOG * log){  pthread_mutex_lock (&(log_list.mtx));  if (log_list.head == NULL)    log_list.head = log_list.tail = log;  else  {    (log_list.tail)->next = log;    log_list.tail = log;  }  log_list.count++;  pthread_mutex_unlock (&(log_list.mtx));}static LOG *Pop (){  LOG *log;  pthread_mutex_lock (&(log_list.mtx));  if (log_list.head == NULL)  {    log = log_list.head;  }  else  {    log = log_list.head;    log_list.head = log_list.head->next;    log_list.count--;  }  pthread_mutex_unlock (&(log_list.mtx));  return log;}intWriteLog (const char *fmt, ...){  char szTmp[512] = { 0 };  LOG *log;  va_list argptr;  va_start (argptr, fmt);  vsnprintf (szTmp, sizeof (szTmp), fmt, argptr);  va_end (argptr);  printf ("%s", szTmp);  if (!bSwitch && bStarted)    return 0;  if (fmt == NULL)    return -1;  log = (LOG *) malloc (sizeof (LOG));  if (log == NULL)    return -1;  memset (log, 0, sizeof (LOG));  log->next = NULL;  log->content = (char *) malloc (strlen (szTmp) + 64);  if (log->content == NULL)  {    free (log);    return -1;  }  snprintf (log->content, strlen (szTmp) + 64, "pid(%d) thr(%d):%s",	    getpid (), pthread_self (), szTmp);  log->length = strlen (szTmp) + 64;  Push (log);  return 1;}intGetLogNums (){  int ret;  pthread_mutex_lock (&(log_list.mtx));  ret = log_list.count;  pthread_mutex_unlock (&(log_list.mtx));  return ret;}static voidCleanUp (void *arg){  LOG *log;  /*printf ("In CleanUp.\n");     printf ("items(%d)\n", GetLogNums ()); */  while ((log = Pop ()) != NULL)  {    if (log->content)      free (log->content);    if (log)      free (log);    printf ("freed a item\n");  }  /*printf ("released items(%d)\n", GetLogNums ()); */}voidTrimChar (char *ptr, char c){  int i, min, max, len;  if (*ptr == 0)    return;  for (i = 0; i < strlen (ptr); i++)  {    if (ptr[i] != c && ptr[i] != '\r' && ptr[i] != '\n')      break;  }  min = i;  for (i = strlen (ptr) - 1; i > -1; i--)  {    if (ptr[i] != c && ptr[i] != '\r' && ptr[i] != '\n')      break;  }  max = i + 1;  len = max - min;  for (i = 0; i < len; i++)    ptr[i] = ptr[i + min];  ptr[i] = 0;  return;}static void *Gzip (void *arg){  char szTemp[64];  char szFileName[128];  char szList[128];  char szCmd[512];  FILE *fp;  struct stat st;  time_t mt, now;  struct tm *tim;  printf ("In Gzip!\n");  for (;;)  {    sleep (cfg.period);    sprintf (szList, "ls %s|grep -v \".gz$\"", cfg.log_path);    fp = popen (szList, "r");    while (fgets (szTemp, sizeof (szTemp) - 1, fp) != NULL)    {      TrimChar (szTemp, ' ');      sprintf (szFileName, "%s/%s", cfg.log_path, szTemp);      printf ("Gzip %s\n", szFileName);      memset (&st, 0, sizeof (st));      if (stat (szFileName, &st) < 0)      {	printf ("%s doesn't exist!\n", szFileName);	continue;      }      if (S_ISDIR(st.st_mode))      {      	continue;      }      now = time (NULL);      mt = now - st.st_mtime;      tim = localtime (&mt);      if (tim->tm_mday - 1 > cfg.compress_log)      {	sprintf (szCmd, "/bin/gzip -c %s>>%s.gz", szFileName, szFileName);	printf ("%s\n", szCmd);	system (szCmd);	sprintf (szCmd, "/bin/rm -f %s", szFileName);	system (szCmd);      }    }    pclose (fp);  }}static void *Dispose (void *arg){  char szTemp[64];  char szFileName[128];  char szList[128];  char szCmd[512];  FILE *fp;  struct stat st;  time_t mt, now;  struct tm *tim;  printf ("In Dispose\n");  for (;;)  {    sleep (cfg.period);    sprintf (szList, "ls %s|grep \".gz$\"", cfg.log_path);    fp = popen (szList, "r");    while (fgets (szTemp, sizeof (szTemp) - 1, fp) != NULL)    {      TrimChar (szTemp, ' ');      sprintf (szFileName, "%s/%s", cfg.log_path, szTemp);      printf ("Dispose %s\n", szFileName);      memset (&st, 0, sizeof (st));      if (stat (szFileName, &st) < 0)      {	printf ("%s doesn't exist!\n", szFileName);	continue;      }      if (S_ISDIR(st.st_mode))      {      	continue;      }            now = time (NULL);      mt = now - st.st_mtime;      tim = localtime (&mt);      if (tim->tm_mday - 1 > cfg.delete_log_day)      {	sprintf (szCmd, "/bin/rm -f %s", szFileName);	printf ("%s\n", szCmd);	system (szCmd);      }    }    pclose (fp);  }}static void *Worker (void *arg){  char szFilename[128] = { 0 };  char szTemp[32];  char szScript[256];  FILE *fp;  FILE *pp;  time_t tt;  struct tm *tim;  LOG *log;  int i, j;  pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);  pthread_cleanup_push (CleanUp, (void *) NULL);  printf ("In Worker procedure...\n");  for (;;)  {    if (!bSwitch)    {      CleanUp (NULL);      usleep (5 * 1000);      continue;    }    if ((log = Pop ()) == NULL)    {      usleep (3 * 1000);    }    else    {      memset (szFilename, 0, sizeof (szFilename));      for (i = 0; strlen (cfg.log_name[i]) > 0; i++)      {	if (strstr (cfg.log_name[i], "`"))	{	  memset (szTemp, 0, sizeof (szTemp));	  sscanf (cfg.log_name[i], "`%s`", szTemp);	  for (j = 0; szTemp[j]; j++)	  {	    if (szTemp[j] == '_')	      szTemp[j] = ' ';	  }	  TrimChar (szTemp, '`');	  printf ("szTemp(%s)\n", szTemp);	  pp = popen (szTemp, "r");	  if (pp == NULL)	    continue;	  memset (szScript, 0, sizeof (szScript));	  if (fgets (szScript, sizeof (szScript) - 1, pp) == NULL)	  {	  	pclose (pp);	    continue;		}	  pclose (pp);	  TrimChar (szScript, ' ');	  strcat (szFilename, szScript);	}	else	{	  strcat (szFilename, cfg.log_name[i]);	}	strcat (szFilename, " ");      }      TrimChar (szFilename, ' ');      memset (szScript, 0, sizeof (szScript));      sprintf (szScript, "%s/%s", cfg.log_path, szFilename);      for (i = 0; szScript[i]; i++)      {	if (szScript[i] == ' ')	  szScript[i] = '_';      }      printf ("file name is : %s\n", szScript);      fp = fopen (szScript, "a+");      if (fp == NULL)	continue;      tt = time (NULL);      tim = localtime (&tt);      fprintf (fp, "[%04d%02d%02d %02d:%02d:%02d]\n",	       tim->tm_year + 1900,	       tim->tm_mon + 1,	       tim->tm_mday, tim->tm_hour, tim->tm_min, tim->tm_sec);      fprintf (fp, "%s\n", log->content);      fclose (fp);      if (log->content != NULL)	free (log->content);      if (log != NULL)	free (log);    }  }  return NULL;}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -