PageRenderTime 51ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/RightLog_PERL/EssbaseRightLog_v2.0.pl

http://essbaserightlog.googlecode.com/
Perl | 466 lines | 361 code | 64 blank | 41 comment | 60 complexity | b3223d1e79c0f3bbd669937f929eedc6 MD5 | raw file
  1. #!/usr/bin/perl
  2. # Module include
  3. use Getopt::Std;
  4. # Set argument parameters
  5. getopts( "i:o:d:chs:f:t", \%opts ) or DisplayUsage();
  6. # Verify arguments
  7. DisplayHelp();
  8. TestInputFileArg();
  9. #TestOutputFileArg();
  10. TestDateFormatArg();
  11. TestSeparatorArg();
  12. if ( $opts{o} ) {
  13. open( OUTPUT, ">$opts{o}" )
  14. or die print "Error: could not open '$opts{o}'\n";
  15. # Insert header on top
  16. if ( $opts{t} ) {
  17. print OUTPUT SetHeader();
  18. }
  19. }
  20. else {
  21. # Insert header on top
  22. if ( $opts{t} ) {
  23. print SetHeader();
  24. }
  25. }
  26. # For each log file
  27. foreach $i (@i) {
  28. # Open logfile
  29. open( LOGFILE, "$i" )
  30. or die print "Error: '$i' not found in specified path\n";
  31. while (<LOGFILE>) {
  32. # Skip blank lines
  33. next unless ( !/^(\s)*$/ );
  34. # Advanced delimiter (not "[")
  35. if (/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)/i) {
  36. chomp;
  37. $Line = $_; # Current line
  38. EssDelimitedLog();
  39. }
  40. # Default delimiter ("[")
  41. elsif (/^\[(Mon|Tue|Wed|Thu|Fri|Sat|Sun)/i) {
  42. chomp;
  43. $Line = $_; # Current line
  44. $Line2 = <LOGFILE>; # Read next line
  45. chomp($Line2);
  46. EssClassicLog();
  47. }
  48. # Other case (description)
  49. else {
  50. chomp;
  51. $Line = $_; # Current line
  52. Other();
  53. }
  54. if ( $opts{o} ) {
  55. if ( $Line =~ /.*$opts{f}.*$/ ) {
  56. print OUTPUT $Line . "\n";
  57. }
  58. else {
  59. #print OUTPUT $Line . "\n";
  60. }
  61. }
  62. else {
  63. if ( $Line =~ /.*$opts{f}.*$/ ) {
  64. print $Line. "\n";
  65. }
  66. else {
  67. #print $Line . "\n";
  68. }
  69. }
  70. }
  71. close(LOGFILE);
  72. }
  73. close(OUTPUT);
  74. exit;
  75. #------------------------------------------------------------
  76. # FUNCTIONS
  77. #------------------------------------------------------------
  78. # Essbase v.5, 6, 7, 9 classic delimiters ([, ])
  79. sub EssClassicLog {
  80. $Line =~ s/^\[//; # Replace opening bracket ([) with nothing
  81. $Line =~ s/\]/$s/; # Replace closing bracket (])
  82. $Line =~ s/\ /$s/ for 1 .. 4; # Replace 4 1st whitespace
  83. $Line =~ s/\//$s/gm; # Replace slash delimiters (/)
  84. ChangeDateFormat();
  85. if ( $opts{c} ) { AddMessageCategory(); }
  86. else {
  87. $Line =~ s/[()]/$s/ for 1 .. 2; # Replace bracket delimiters ((,))
  88. }
  89. unless ( $Line2 =~ /^(\s)*$/ ) { # Join with next line if not empty
  90. $Line = $Line . $Line2;
  91. }
  92. $Line =~ s/ +/ /gm; # Replacing multi-space by single space
  93. $Line =~ s/[ \t]+$//gm; # Deleting eol tab/space
  94. }
  95. #--------------------------------
  96. # Essbase v. 6, 7, 9 advanced delimiters
  97. # DELIMITEDMSG setting in config file with parameter: *, :, &, #, ~
  98. sub EssDelimitedLog {
  99. my @f = split /[~^*&:]/, $Line; # Split according to defined pattern
  100. # and fill a list
  101. $lastf = scalar(@f);
  102. $Line =
  103. join( $s, @f[ 0 .. 3 ] ) . ':'
  104. . join( ':', @f[ 4 .. 5 ] )
  105. . $s
  106. . join( $s, @f[ 6 .. 11 ] )
  107. . join( '', @f[ 12 .. 13 ] ) . ' '
  108. . join( ' ', @f[ 14 .. $lastf ] );
  109. ChangeDateFormat();
  110. if ( $opts{c} ) { AddMessageCategory(); }
  111. else {
  112. $Line =~ s/[()]/$s/ for 1 .. 2; # Replace bracket delimiters ((,))
  113. }
  114. $Line =~ s/ +/ /gm; # Replacing multi-space by single space
  115. $Line =~ s/[ \t]+$//gm; # Deleting eol tab/space
  116. }
  117. #--------------------------------
  118. sub Other {
  119. if ( $opts{d} ) {
  120. if ( $opts{c} ) {
  121. $Line = "$s$s$s$s$s$s$s$s$s$Line";
  122. }
  123. else {
  124. $Line = "$s$s$s$s$s$s$s$s$Line";
  125. }
  126. }
  127. else {
  128. if ( $opts{c} ) {
  129. $Line = "$s$s$s$s$s$s$s$s$s$s$s$s$Line";
  130. }
  131. else {
  132. $Line = "$s$s$s$s$s$s$s$s$s$s$s$Line";
  133. }
  134. }
  135. $Line =~ s/ +/ /gm; # Replacing multi-space by single space
  136. $Line =~ s/\t//gm; # Deleting tab
  137. $Line =~ s/[ \t]+$//gm; # Deleting eol tab/space
  138. }
  139. #--------------------------------
  140. sub DisplayHelp {
  141. if ( $opts{h} ) {
  142. print "DESCRIPTION:\n"
  143. . "Parse ANY Essbase or Analytic Services (v.5-v.9) server and application logs.\n"
  144. . "Generate a full custom delimited spreadsheet/database ready output\n"
  145. . "for enhanced analysis.\n"
  146. . "Options available: advanced date formatting, headers insertion,\n"
  147. . "detailed message categories, filtering, custom separator.\n";
  148. print "AUTHOR:\n"
  149. . "Written by Sebastien Roux <roux.sebastien@gmail.com>\n";
  150. print "LICENSE:\n"
  151. . "GNU General Public License version 3 (GPLv3)";
  152. print "NOTES:\n"
  153. . "Use at your own risk!\n"
  154. . "You will be solely responsible for any damage\n"
  155. . "to your computer system or loss of data\n"
  156. . "that may result from the download\n"
  157. . "or the use of the following application/script.\n";
  158. DisplayUsage();
  159. }
  160. }
  161. #--------------------------------
  162. sub DisplayUsage {
  163. print "\nUsage: perl EssbaseRightLog.pl -i <logfile(s)> "
  164. . "[-o <outputfile>, -c, -d <arg>, -t, -s <arg>, -f <arg>, -h]\n\n";
  165. print "Usage: EssbaseRightLog.exe -i <logfile(s)> "
  166. . "[-o <outputfile>, -c, -d <arg>, -t, -s <arg>, -f <arg>, -h]\n\n";
  167. print " -i specify Essbase log(s), args: <file1[;file2;...]>\n";
  168. print " -o specify output file\n";
  169. print " -c specify message categories\n";
  170. print " -d specify date format, arg: <ISO|EUR|US>\n";
  171. print " -t specify headers on top\n";
  172. print " -s specify separator, arg: <*>\n";
  173. print " -f specify filter, arg: <*>\n";
  174. print " -h display usage\n";
  175. exit;
  176. }
  177. #--------------------------------
  178. sub TestInputFileArg {
  179. @i = split /;/, $opts{i};
  180. foreach $i (@i) {
  181. if ( !-e $i ) {
  182. print "Error: '$i' does not exists!\n";
  183. DisplayUsage();
  184. }
  185. }
  186. }
  187. #--------------------------------
  188. sub TestOutputFileArg {
  189. if ( !-d $opts{o} ) {
  190. print "Error: '$opts{o}' is not a valid directory!\n";
  191. DisplayUsage();
  192. }
  193. }
  194. #--------------------------------
  195. sub TestDateFormatArg {
  196. if ( $opts{d}
  197. && ( uc( $opts{d} ) ne "ISO" )
  198. && ( uc( $opts{d} ) ne "EUR" )
  199. && ( uc( $opts{d} ) ne "US" ) )
  200. {
  201. print "Error: '$opts{d}' is not a valid argument for date format";
  202. DisplayUsage();
  203. }
  204. }
  205. #--------------------------------
  206. # Add category for message code
  207. sub AddMessageCategory {
  208. my $MsgCode;
  209. my $MsgType;
  210. if ( $Line =~ m/\d{7,7}/ ) {
  211. $MsgCode = $&;
  212. if ( $MsgCode ge 1003000 && $MsgCode le 1003040 ) {
  213. $MsgType = "Data Load";
  214. }
  215. elsif ( $MsgCode ge 1006002 && $MsgCode le 1006051 ) {
  216. $MsgType = "Data Cache";
  217. }
  218. elsif ( $MsgCode ge 1008001 && $MsgCode le 1008152 ) {
  219. $MsgType = "System Call";
  220. }
  221. elsif ( $MsgCode ge 1012000 && $MsgCode le 1012750 ) {
  222. $MsgType = "Calculation";
  223. }
  224. elsif ( $MsgCode ge 1014004 && $MsgCode le 1014043 ) {
  225. $MsgType = "Lock Manager";
  226. }
  227. elsif ( $MsgCode ge 1019002 && $MsgCode le 1019054 ) {
  228. $MsgType = "Db Objects";
  229. }
  230. elsif ( $MsgCode ge 1040002 && $MsgCode le 1042025 ) {
  231. $MsgType = "Network";
  232. }
  233. elsif ( $MsgCode ge 1052001 && $MsgCode le 1054030 ) {
  234. $MsgType = "Agent";
  235. }
  236. elsif ( $MsgCode ge 1120000 && $MsgCode le 1120002 ) {
  237. $MsgType = "Grid API";
  238. }
  239. elsif ( $MsgCode ge 1130203 && $MsgCode le 1130613 ) {
  240. $MsgType = "Misc";
  241. }
  242. elsif ( $MsgCode ge 1270006 && $MsgCode le 1270517 ) {
  243. $MsgType = "ASO";
  244. }
  245. else { $MsgType = "Other"; }
  246. $Line =~ s/\(\d{7,7}\)/$s$MsgCode$s$MsgType$s/;
  247. }
  248. }
  249. #--------------------------------
  250. sub GetTime {
  251. ( $sec, $min, $hour, $day, $month, $year ) = localtime(time);
  252. my $files = printf "%4d%02d%02d_%02d%02d%02d", $year + 1900, $month + 1,
  253. $day, $hour, $min, $sec;
  254. print "$files\n";
  255. return $files;
  256. }
  257. #--------------------------------
  258. sub ChangeDateFormat {
  259. ChangeMonthString();
  260. my @l = split /[$s]/, $Line;
  261. my $last;
  262. # Set date format to ISO 8601 extended style (YYYY-MM-DD)
  263. if ( uc( $opts{d} ) eq "ISO" ) {
  264. $last = scalar(@l);
  265. $Line =
  266. @l[ 4 .. 4 ] . '-'
  267. . @l[ 1 .. 1 ] . '-'
  268. . @l[ 2 .. 2 ]
  269. . $s
  270. . join( $s, @l[ 3 .. 3 ] )
  271. . $s
  272. . join( $s, @l[ 5 .. $last - 1 ] );
  273. }
  274. # Set date format to US style (MM/DD/YYYY)
  275. elsif ( uc( $opts{d} ) eq "US" ) {
  276. $last = scalar(@l);
  277. $Line =
  278. @l[ 1 .. 1 ] . '/'
  279. . @l[ 2 .. 2 ] . '/'
  280. . @l[ 4 .. 4 ]
  281. . $s
  282. . join( $s, @l[ 3 .. 3 ] )
  283. . $s
  284. . join( $s, @l[ 5 .. $last - 1 ] );
  285. }
  286. # Set date format to European style (DD/MM/YYYY)
  287. elsif ( uc( $opts{d} ) eq "EUR" ) {
  288. $last = scalar(@l);
  289. $Line =
  290. @l[ 2 .. 2 ] . '/'
  291. . @l[ 1 .. 1 ] . '/'
  292. . @l[ 4 .. 4 ]
  293. . $s
  294. . join( $s, @l[ 3 .. 3 ] )
  295. . $s
  296. . join( $s, @l[ 5 .. $last - 1 ] );
  297. }
  298. }
  299. #--------------------------------
  300. # Replace month label by month number
  301. sub ChangeMonthString {
  302. my $MonthIndex;
  303. if ( $Line =~ m/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/ ) {
  304. if ( lc($&) eq "jan" ) { $MonthIndex = "01"; }
  305. elsif ( lc($&) eq "feb" ) { $MonthIndex = "02"; }
  306. elsif ( lc($&) eq "mar" ) { $MonthIndex = "03"; }
  307. elsif ( lc($&) eq "apr" ) { $MonthIndex = "04"; }
  308. elsif ( lc($&) eq "may" ) { $MonthIndex = "05"; }
  309. elsif ( lc($&) eq "jun" ) { $MonthIndex = "06"; }
  310. elsif ( lc($&) eq "jul" ) { $MonthIndex = "07"; }
  311. elsif ( lc($&) eq "aug" ) { $MonthIndex = "08"; }
  312. elsif ( lc($&) eq "sep" ) { $MonthIndex = "09"; }
  313. elsif ( lc($&) eq "oct" ) { $MonthIndex = "10"; }
  314. elsif ( lc($&) eq "nov" ) { $MonthIndex = "11"; }
  315. elsif ( lc($&) eq "dec" ) { $MonthIndex = "12"; }
  316. $Line =~ s/$&/$MonthIndex/;
  317. }
  318. }
  319. #--------------------------------
  320. # Set default separator (|) if separator arg not specified
  321. sub TestSeparatorArg {
  322. my $defaultseparator = "|";
  323. if ( not( $opts{s} ) ) { $s = $defaultseparator; }
  324. else { $s = $opts{s}; }
  325. return $s;
  326. }
  327. #--------------------------------
  328. sub SetHeader {
  329. my $Header;
  330. if ( $opts{d} ) {
  331. if ( $opts{c} ) {
  332. $Header =
  333. "date" . $s . "time" . $s . "server" . $s
  334. . "application"
  335. . $s
  336. . "database"
  337. . $s . "user"
  338. . $s
  339. . "msglevel"
  340. . $s
  341. . "msgcode"
  342. . $s
  343. . "msgcat"
  344. . $s
  345. . "description\n";
  346. }
  347. else {
  348. $Header =
  349. "date" . $s . "time" . $s . "server" . $s
  350. . "application"
  351. . $s
  352. . "database"
  353. . $s . "user"
  354. . $s
  355. . "msglevel"
  356. . $s
  357. . "msgcode"
  358. . $s
  359. . "description\n";
  360. }
  361. }
  362. else {
  363. if ( $opts{c} ) {
  364. $Header =
  365. "day" . $s . "month" . $s . "daynum" . $s . "time" . $s . "year"
  366. . $s
  367. . "server"
  368. . $s
  369. . "application"
  370. . $s
  371. . "database"
  372. . $s . "user"
  373. . $s
  374. . "msglevel"
  375. . $s
  376. . "msgcode"
  377. . $s
  378. . "msgcat"
  379. . $s
  380. . "description\n";
  381. }
  382. else {
  383. $Header =
  384. "day" . $s . "month" . $s . "daynum" . $s . "time" . $s . "year"
  385. . $s
  386. . "server"
  387. . $s
  388. . "application"
  389. . $s
  390. . "database"
  391. . $s . "user"
  392. . $s
  393. . "msglevel"
  394. . $s
  395. . "msgcode"
  396. . $s
  397. . "description\n";
  398. }
  399. }
  400. return $Header;
  401. }
  402. __END__