Oracle告警日志挖掘(上)

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

下边是一小段C程序,用来从Oracle告警日志中提取指定时间点或时间范围的日志行。这些被提取的日志行依赖模板文件中的条目。接下来是相关语法和一个模板文件的例子以及一个命令样例。我希望这些源码在被我粘贴到这儿时没有被丢失。

  语法: getalerts [[-a] [-f afile] [-p pfile]           [-b mmddyyyy] [-e mmddyyyy]]   选项:   -a ……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

下边是一小段C程序,用来从Oracle告警日志中提取指定时间点或时间范围的日志行。这些被提取的日志行依赖模板文件中的条目。接下来是相关语法和一个模板文件的例子以及一个命令样例。我希望这些源码在被我粘贴到这儿时没有被丢失。

  语法:

getalerts [[-a] [-f afile] [-p pfile]
          [-b mmddyyyy] [-e mmddyyyy]]

  选项:

  -a          此选项表示从告警日志中提取指定时间范围内的所有日志行。

  -f afile    指定选用的告警日志文件。如果此选项被忽略,则输入值被假定来自输入值。

  -f pfile    指定选用的模板文件。此文件中每一行就是一个模板,模板可能是“正则表达式”。模板条数有最大值,当前,该值为40.任何特殊模板的最大长度为80个字符。如果此选项被忽略,且-a选项没有设置,那么只有包含字符串“ORA-”的日志行才会被提取出来。如果-a选项已经设置,则-p选项将被忽略。

  -b mmddyyyy 指定需检测时间范围的起始时间。如果此选项被忽略,则使用当前时间。

  -e mmddyyyy 指定需检测时间范围的结束时间。如果此选项被忽略,则使用起始时间。

  下边是一个模板文件的例子:


ORA-
cannot allocate new log
All online logs need
could not connect
encountered error
lost listener
Errors in file
Restarting
Starting ORACLE
Shutting down
WARNING:

  执行举例:

getalerts -f /oracle/admin/faxdb/bdump/alert_faxdb.log
          -p /oracle/local/bin/alert_patterns.rex
          -b 01012002 -e 01312002

  以下是代码:

/*
*********************************************************************
*注:以上所用的代码在下边的一个变量中被再三重复,且它被用来向用户   *
*反馈用法。请确保当你把它修改成上面的值时,要在变量中也将它修改一下。*
**********************************************************************/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*
---------------------------------------------------------------------包含文件
---------------------------------------------------------------------
*/
#include
#include
#include
#include
#include
#include
#include

/*
--------------------------- 定义----------------------
*/
#define MAX_INPUT_LENGTH        2048
#define MAX_PATTERNS            40
#define MAX_PATTERN_LENGTH      80

#define TRUE                    1
#define FALSE                   0

#define DAYS_OF_WEEK     "(Mon|Tue|Wed|Thu|Fri|Sat|Sun) "
#define MONTHS_OF_YEAR   "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) "

/*
---------------------全局变量---------------------------
*/
/* 模板数组*/
char            pattern[MAX_PATTERNS][MAX_PATTERN_LENGTH];
char            default_pattern[] = "ORA-";

/* 输入行,大多数最近的时间戳行以及时间戳细分目录*/

char            inputline[MAX_INPUT_LENGTH];
char            previous_timestamp[MAX_INPUT_LENGTH];

char            Day[] = "Mon";
char            Mon[] = "Dec";
char            dd[] = "25";
char            hhmmss[] = "12:30:00";
char            yyyy[] = "2001";

/*月数组(用来计算月的数值)*/

char            month_abbrev[] = "JanFebMarAprMayJunJulAugSepOctNovDec";

/*正则表达式时间戳*/

char            alert_date_pattern[] = "^"
                                       DAYS_OF_WEEK
                                       MONTHS_OF_YEAR
                                       ".. "
                                       "..:..:.. "
                                       "....";

/*将时间戳转换为此格式  */

char            mmddyyyy[] = "12252001";

/*命令行选项*/

char            options[] = "af:p:b:e:";

/*命令行参数*/

int             a_flag   = FALSE;
char            *f_value = NULL;
char            *p_value = NULL;
char            *b_value = NULL;
char            *e_value = NULL;

/*模板个数*/

int             number_of_patterns = 0;

/*状态标识/*

int             option_error        = FALSE;
int             input_error         = FALSE;

int             patterns_loaded     = FALSE;

int             select_all          = FALSE;
int             select_default      = FALSE;

int             in_the_interval     = FALSE;
int             beyond_the_interval = FALSE;
int             timestamp_printed   = FALSE;

/*时间值*/

long            bgn_epoch, end_epoch, inputline_epoch, tmp_epoch;

/* 结构 */

time_t          current_time;

regex_t         timestamp_regular_exp;
regex_t         pattern_regular_exp[MAX_PATTERNS];

/* 文件指针 */

FILE            *input_file, *pattern_file;

/*用法描述*/

char            usage_description[] =
  " [[-a] [-f afile] [-p pfile] [-b mmddyyyy] "
  "[-e mmddyyyy]]"
  "nn"
  "-a      Extract all the alert log lines for the specified date range evenn"
  "        if a pattern file is supplied.n"
  "-f      'afile' is the filespec for the alert log to be used.n"
  "        If this option is not specified then stdin is used.n"
  "-p      'pfile' is the filespec for the reg expr pattern file.n"
  "        If this option is not used then only ORA- lines are extractedn"
  "        unless the -a option is present.n"
  "        If the -a option is present then the -p option is ignored.n"
  "-b      mmddyyyy is the beginning date.n"
  "        If this option is not used then the current date is used.n"
  "-e      mmddyyyy is the ending date.n"
  "        If this option is not used then the begin date is used.n"
  " n"
  "        If begin date > end date then these dates are 'swapped'.n"
  "nn";
 
/*综合例子*/

char            *charptr;

int             i,j,k;

/*
---------------------------------------------------------------------子程序原型
---------------------------------------------------------------------
*/
void usage(char *cmd);
long date2epoch(char *mmddyyyy);
int  epoch2date(long epoch, char *mmddyyyy);

/*
////////////////////////////////////////
        main
////////////////////////////////////////
*/
int main(int argc, char **argv)
{

   /*
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
       过程命令行参数
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   */
/*处理程序中的未知选项*/
   opterr = 0;

/*无参时的使用方法 */
   if (argc < 2)
   {
      usage(argv[0]);
      exit(0);
   }

/*查看所有选项*/
   while ((i = getopt(argc,argv,options)) != -1)
   switch (i)
   {
      case 'a':
         a_flag = TRUE;                 /*全选 */
         break;

      case 'b':                         /*开始日期*/
         b_value = optarg;
         break;

      case 'e':                         /*结束日期*/
         e_value = optarg;
         break;

      case 'f':                         /* 指定告警日志文件*/
         f_value = optarg;
         break;

      case 'p':                         /*指定模板文件*/
         p_value = optarg;
         break;

      case '?':                         /*未知选项*/
         option_error = TRUE;

         if (isprint(optopt))
            fprintf( stderr
                    ,"ERROR==> Unknown option or missing value: '-%c'n"
                    ,optopt
                   );
         else
            fprintf( stderr
                    ,"ERROR==> Unknown option or missing value: 'x%x'n"
                    ,optopt
                   );

         break;

      default:
         abort();
   }

   /*检测未知问题*/

   for (j = optind; j < argc; j++)
   {
      option_error = TRUE;

      fprintf(stderr,"ERROR==> Non-option argument %sn", argv[j]);
   }

   /*
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         编辑选项值
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   */

/*-a选项是否被设置*/
   if (a_flag)
   {
      select_all = TRUE;
   }

   /* Determine begin date */
   if (b_value == NULL)
   {

/*如果没有设置-b选项,则使用当前值*/

      time(&current_time);
      j = epoch2date((long) current_time, mmddyyyy);
      bgn_epoch = date2epoch(mmddyyyy);
   }
   else
   {
      /*使用-b选项日期*/
      bgn_epoch = date2epoch(b_value);
      if (bgn_epoch == 0)
      {
         fprintf( stderr
                 ,"ERROR==> Invalid begin date (%s): Format is mmddyyyyn"
                 ,b_value
                );
         option_error = TRUE;
      }
   }

   /*检测结束时间*/

   if (e_value == NULL)
   {

      /*如果-e选项没有设置,则使用开始日期*/

      end_epoch = bgn_epoch;
   }
   else
   {
      /*如果-e选项已设置*/

      end_epoch = date2epoch(e_value);

      if (end_epoch == 0)
      {
         fprintf( stderr
                 ,"ERROR==> Invalid end date (%s): Format is mmddyyyyn"
                 ,e_value
                );
         option_error = TRUE;
      }
   }

   /*如果起始日期比结束日期要晚,则交换起始日期与结束日期*/

   if (bgn_epoch > end_epoch)
   {
      tmp_epoch = bgn_epoch;
      bgn_epoch = end_epoch;
      end_epoch = tmp_epoch;
   }

   /*打开输入文件*/

   if (f_value == NULL)
   {
      /*如果-f选项没有设置,则使用stdin */

      input_file = stdin;
   }
   else
   {
      input_file = fopen(f_value,"r");

      if (input_file == NULL)
      {
         fprintf(stderr,"ERROR==> Can't open input file (%s)n",f_value);
         option_error = TRUE;
      }
   }

   /*如果-a选项没有设置,则打开模板文件 */

   if (!select_all)
   {
      if (p_value == NULL)
      {

         /* 如果-p选项没有设置,则使用默认模板 */

         select_default = TRUE;
      }
      else
      {
         pattern_file = fopen(p_value,"r");

         if (pattern_file == NULL)
         {
            fprintf(stderr,"ERROR==> Can't open pattern file (%s)n",p_value);
            option_error = TRUE;
         }
      }
   }

   /*如果选项错误,则退出*/

   if (option_error)
   {
      fprintf(stderr,"Quit due to option errorsn");
      usage(argv[0]);
      exit(1);
   }

   /*
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -加载模板
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   */
   if (!select_all)
   {
      if (select_default)
      {

         /*使用默认模板*/

         strncpy(pattern[0],default_pattern,MAX_PATTERN_LENGTH-1);
         j = regcomp ( &pattern_regular_exp[0]
                      ,pattern[0]
                      ,REG_EXTENDED | REG_NOSUB
                     );
         number_of_patterns++;
      }
      else
      {

         /*读取样式文件里的记录*/

         for (i = 0; i < MAX_PATTERNS-1; i++)
         {
            fgets(pattern[i],MAX_PATTERN_LENGTH-1,pattern_file);

            if (feof(pattern_file))
            {
               /*样式文件结束*/
               patterns_loaded = TRUE;
               fclose(pattern_file);
               break;
            }

            if (ferror(pattern_file))
            {
               /*样式文件中的输入输出错误*/
               input_error = TRUE;
               fprintf(stderr,"ERROR==> Reading pattern filen");
               break;
            }

            if (pattern[i][strlen(pattern[i])-1] != 'n')
            {
               input_error = TRUE;
               fprintf(stderr,"ERROR==> Pattern %d too longn",i+1);
               break;
            }
            else
            {
               /* 用空值替换换行并编辑正则表达式*/
               pattern[i][strlen(pattern[i])-1] = '0';
               j = regcomp ( &pattern_regular_exp[i]
                            ,pattern[i]
                            ,REG_EXTENDED | REG_NOSUB
                           );
               number_of_patterns++;
            }

         }

         if ((!patterns_loaded) && (!input_error))
         {
            /* 样式文件中记录太多*/
            input_error = TRUE;
            fprintf( stderr
                    ,"ERROR==> Max patterns (%d) exceededn"
                    ,MAX_PATTERNS
                   );
            fclose(pattern_file);
         }
      }
   }

   /* 读取样式文件出错时退出*/
   if (input_error)
   {
      fprintf(stderr,"Quit due to pattern errorsn");
      exit(1);
   }

   /*

相关推荐