Oracle告警日志挖掘(下)

 
   | |

导读:本文继续介绍用来从Oracle告警日志中提取指定时间点或时间范围的日志行的C程序。

关键词:Oracle Oracle告警日志 Oracle告警C程序

正在加载数据... 【TechTarget中国原创】本文继续介绍用来从Oracle告警日志中提取指定时间点或时间范围的日志行的C程序以及相关语法和一个模板文件的例子以及一个命令样例。

【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;
}

 
查看全文
 
 
 
 
 

Oracle应用的实施与升级

 
在针对MySQL问题一直与欧盟僵持不下的Oracle主席Larry Ellison,或许将要采取折中的方式来确保交易审核的顺利通过。
 
SPS对OBIEE的扩展方式非常满意,它可以满足其不断变化波动的流量。公司官方因为扩容而尝到了产品缓存能力的甜头,这帮助他们解决了数据库的技术问题。
 
在Salesforce.com的CEO Marc Benioff开始他的演讲之前,通过客户面板我们可以看到一些成功的Oracle CRM部署经验,十分值得我们注意。
 
甲骨文公司增值经销商和系统集成商应该专注于垂直市场和专门的技术,甲骨文公司高层在甲骨文2009年全球大会上敦促了这一点。
 
四年前,时代华纳电视制作分公司开始着手实施一项战略性举措,将其财务与业务系统更好地整合以便简化报告并增加透明度。
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录