如何用正则表达式分析日志文件?备择方案?

时间:2011-09-23 09:53:48

标签: regex logging analysis

我想分析一些日志以了解一些使用情况。 基本上我想做的是使用正则表达式来缓解分析的痛苦

所以我有一个带有日志的文本文件

2011-09-17 09:16:33,531 INFO  [someJava.class.special] sendRequest: fromGevoName=null, ctrlPageId=fooBar, actionId=search,
2011-09-17 09:16:33,976 INFO  [someJavaB.class] fooBar
2011-09-17 09:16:33,982 DEBUG [someOtherJava.class] abc blabala
2011-09-17 09:16:33,987 INFO  [someJava.class.special] sendRequest completed: fromGevoName=XYZ, toPageId=fooBar, userId=someUser

.... 我想计算位置

的所有单词的出现次数

[someJava.class.special] ctrlPageId=....

在这种情况下fooBar并且只发生这种情况。有许多不同的fooBar,我想计算一次发生的频率。

我的想法是用匹配的组替换并重复它,这是

((?s).*\[someJava.class.special\] sendRequest: fromGevoname=.* ctrlPageId=([^,]*)(?-s).*)*

并将其替换为匹配的组\2

然后分析excel中的列表。 但我的greptool不重复正则表达式,它只匹配一次。我使用grepWin,可能有不同的工具/正则表达式吗?

好吧,它基本上是wingrep或grepwin的问题。如果重复使用,修改器(?s)会启用点上的换行符或禁用它(?-s)不起作用。 所以我用正面的东西交换了正则表达式:

([\n-\[\(\]\.,:0-9a-zA-Z]).*\[someJava.class.special\] sendRequest: fromGevoname=.* ctrlPageId ([^,]*)(?-s).*

所以基本上我用第一个换行符匹配的点交换了包含换行符在字符串中可能出现的所有符号。它有效......我确信有一个更好的解决方案,总是为它打开

1 个答案:

答案 0 :(得分:1)

我不确定我理解,但如果你要找的输出是:
someJava fooBar

这样的事情应该有用(php脚本):

<?php
$log = file_get_contents('file.log')
preg_match_all("#\[(?<className>\w+)\.class(.special)?\](.*?)ctrlPageId=(?<controllerName>\w+)#i", $log, $m);

for ($i=0; $i < count($m[0]); $i++) {
  echo $m['className'][$i] . ' ' . $m['controllerName'][$i] . "\n";
}