下边是一小段C程序,用来从Oracle告警日志中提取指定时间点或时间范围的日志行。这些被提取的日志行依赖模板文件中的条目。接下来是相关语法和一个模板文件的例子以及一个命令样例。我希望这些源码在被我粘贴到这儿时没有被丢失。
语法: getalerts [[-a] [-f afile] [-p pfile] [-b mmddyyyy] [-e mmddyyyy]] 选项: -a ……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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(¤t_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);
}
/*
相关推荐
-
甲骨文自治数据库亮相 带来云计算新希望
早前甲骨文还不在云计算公司之列,而现在该公司正在迅速弥补其失去的时间。甲骨文的云计算核心是甲骨文自治数据库(O […]
-
2017年12月数据库流行度排行榜 定格岁末排名瞬间
数据库知识网站DB-engines最近更新的2017年12月份数据库流行度排名情况是否能提供更多的看点呢?TechTarget数据库网站将与您分享12月份的榜单排名情况,让我们拭目以待。
-
2017年11月数据库流行度排行榜 半数以上数据库积分减少
数据库知识网站DB-engines更新了2016年11月份的数据库流行度排行榜。TechTarget数据库网站将与您一同关注11月份的榜单排名情况。
-
控制合约 不再畏惧Oracle
许多公司都与Oracle有无限制授权协议,他们害怕离开这个协议,所以就证明他们在使用Oracle的软件,即使因为需求单独购买部分授权许可也可能总体是省钱的。