Oracle告警日志挖掘(下)

日期: 2009-06-01 作者:Bill Robillard翻译:ecubestudio 来源:TechTarget中国 英文

 – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –    &nbs……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        选择选中日期区间内的代码行
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   */
   /*编译时间戳正则表达式样式*/
   j = regcomp ( ×tamp_regular_exp
                ,alert_date_pattern
                ,REG_EXTENDED | REG_NOSUB
               );
   i = 0;
   if (
       (fgets(inputline, MAX_INPUT_LENGTH-1, input_file) == NULL)
       &&
       (!feof(input_file))
      )
      input_error = TRUE;

   /* 进行输入,直到文件结尾或输入错误,或超出时间范围*/
   while (!feof(input_file) && !input_error && !beyond_the_interval)
   {
      i++;

      /* 检测代码行长度*/
      if (strlen(inputline) > MAX_INPUT_LENGTH)
      {
         input_error = TRUE;
         break;
      }
      /*此行是否看起来像时间戳行*/
      j = regexec (×tamp_regular_exp, inputline, (size_t) 0, NULL, 0);

      if (j == 0)
      {
         /* 获取时间戳部分行*/
         j = sscanf(inputline,"%s%s%s%s%s",Day,Mon,dd,hhmmss,yyyy);
         /* 指定月缩写列表中的Mon条目  */
         charptr = strstr(month_abbrev,Mon);
         if (charptr != 0)
         {
            /*计算月数据值*/
            k = (int) (1+(charptr - month_abbrev)/3);
            /*格式化日期字段并计算时间值 */
            j = sprintf(mmddyyyy,"%.2d%.2d%s",k,atoi(dd),yyyy);
            inputline_epoch = date2epoch(mmddyyyy);
            /* 判断日期是否在选定范围内*/
            if (   (inputline_epoch >= bgn_epoch)
                && (inputline_epoch <= end_epoch)
               )
            {
               in_the_interval = TRUE;
               /*保存新的时间戳并重置打印状态*/
               /*如果不是之前的时间戳*/
               if (
                   (previous_timestamp != NULL)
&&(strncmp(previous_timestamp,inputline,strlen(inputline)) != 0)
                  )
               {
                  strncpy(previous_timestamp,inputline,strlen(inputline));
                  timestamp_printed = FALSE;
               }
            }
            else if (inputline_epoch > end_epoch)
            {
               /*必段越界*/
               beyond_the_interval = TRUE;
               in_the_interval = FALSE;
               break;
            }

         }
         else
         {
            fprintf( stderr
                    ,"SOFTWARE ERROR==> Can't find month %s in tablen"
                    ,Mon
                   );
         }
      }
      else if (in_the_interval)
      {
         /* 检测样式匹配*/
         for (k=0; k< number_of_patterns; k++)
         {
            /* 正则表达式匹配常规*/
            j = regexec ( &pattern_regular_exp[k]
                         ,inputline
                         ,(size_t) 0
                         ,NULL,0
                        );

            if (j == 0)
            {
               /* 正则表达式匹配 – 时间戳是否被打印?*/
               if (!timestamp_printed)
               {
                  printf("%s",previous_timestamp);
                  timestamp_printed = TRUE;
               }
               /* 打印匹配行*/
               printf("%s",inputline);
               break;
            }
         }
      }
      /* 我们在中断且打印所有代码行?*/
      if (in_the_interval && a_flag)
      {
         printf("%s",inputline);
      }
      /*获取下一行*/
      if (
          (fgets(inputline, MAX_INPUT_LENGTH-1, input_file) == NULL)
          &&
          (!feof(input_file))
         )
         input_error = TRUE;
   }
   fclose(input_file);
   /*
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
       检测状态
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   */
   switch (input_error)
   {
      case FALSE:
         break;

      case TRUE:
         fprintf( stderr
                 ,"ERROR==> Problem with input line %d; may be too longn"
                 ,i
                );
         exit(1);
         break;

      default:
         fprintf( stderr
                 ,"ERROR==> Error at input line %dn"
                 ,i
                );
         exit(1);
         break;
   }

   exit(0);
}

/*
=====================================================================        子程序: date2epoch
=====================================================================
*/
long date2epoch(char *mmddyyyy)
{
   char         mm[]   = "12";
   char         dd[]   = "25";
   char         yyyy[] = "2001";

   int          n;
   time_t       t1;
   struct       tm date;
   /*检测日期值的长度*/
   if (strlen(mmddyyyy) != 8)
      return(0);
   /*检测数字*/
   for (n=0;n<=7;n++)
   {
      if isdigit(mmddyyyy[n])
         continue;
      else
         return(0);
   }
   /* 提取月,日,以及年*/
   mm[0]   = mmddyyyy[0];
   mm[1]   = mmddyyyy[1];
   mm[2]   = '0';
   dd[0]   = mmddyyyy[2];
   dd[1]   = mmddyyyy[3];
   dd[2]   = '0';
   yyyy[0] = mmddyyyy[4];
   yyyy[1] = mmddyyyy[5];
   yyyy[2] = mmddyyyy[6];
   yyyy[3] = mmddyyyy[7];
   yyyy[4] = '0';
   /* 填充日期结构 */
   date.tm_mon  = atoi(mm) - 1;
   date.tm_mday = atoi(dd);
   date.tm_year = atoi(yyyy);
   date.tm_hour = 0;
   date.tm_min  = 0;
   date.tm_sec  = 0;
   /* 检测是两位数字的年还是4位数字的年*/
   if (date.tm_year > 1900)
      date.tm_year -= 1900 ;         /*是的,匹配4位年值*/
   else if (date.tm_year < 50)       /* 2000-2049 */
      date.tm_year += 100;
   date.tm_isdst = -1;               /* 检测DST是否有效*/
   t1 = mktime(&date);               /* 从结构到time_t*/
   return (long) t1;
}

/*
=====================================================================
        子程序: epoch2date
=====================================================================
*/
int epoch2date(long epoch, char *mmddyyyy)
{
   time_t CurrTime;
   struct tm TestTime;
   char *fmt = "%m%d%Y";
   char buff[256];
   CurrTime = epoch;
   memcpy(&TestTime, localtime(&CurrTime), sizeof(TestTime));
   strftime(buff, sizeof(buff), fmt, &TestTime);
   strncpy(mmddyyyy,buff,8);
   return(0);
}
/*
=====================================================================
        子程序: usage
=====================================================================*/
void usage(char *cmd)
{
   printf("Usage:n");
   printf(cmd);
   printf(usage_description);
   return;
}

相关推荐