2010-03-17 75 views
4

我有一些巨大的日志文件(50Mb;〜500K行)我需要开始过滤一些垃圾了。日志文件正在使用log4j的生产,并有基本的模式:我正在寻找一种方式,我可以找出一个正则表达式的开始和结束的正则表达式(或类似的东西),将筛选出匹配通过定义正则表达式筛选日志文件

[log-level] date-time class etc, etc 
log-message 

来自该文件的条目,以便我可以更轻松地浏览这些大量文件。我的想法是,开始的正则表达式应该是日志级别,最终的正则表达式应该是日志消息中的东西。我确信我可以编写一个Java程序来完成这个任务,但是我认为在走下这条路之前我会问社区。提前致谢。


让我扩展我的问题。假设我在日志文件中的以下片段:

[DEBUG] date-time class etc, etc 
log-message-1 

[WARN] date-time class etc, etc 
log-message-2 

[DEBUG] date-time class etc, etc 
log-message-3 

[DEBUG] date-time class etc, etc 
log-message-1 

[WARN] date-time class etc, etc 
log-message-2 

[DEBUG] date-time class etc, etc 
log-message-6 

我想一个办法可以过滤掉logEntry1和logEntry2所以我结束了:

[DEBUG] date-time class etc, etc 
log-message-3 

[DEBUG] date-time class etc, etc 
log-message-6 

我希望做到这一点定义一些正则表达式模式对。在我上面的例子中,我想为logEntry1定义一对,为logEntry2定义另一个。

我希望这有助于澄清我的问题。

+1

这将是一个很好的添加一个更具体的例子。 [日志级别]有哪些可能性?你怎么知道日志消息行何时完成,另一个项目何时开始?帮助我们来帮助你。闻起来像gawk或perl,但需要更多的信息。 – 2010-03-17 17:35:20

+0

日志级别值:DEBUG,INFO,WARN,ERROR,FATAL 当遇到另一个日志级别时,日志消息完成。 – fmpdmb 2010-03-17 18:13:45

+0

备案,50MB并不是那么庞大。 – 2010-03-17 18:15:36

回答

4

假设log-message-1log-message-2和独特模式。

$ awk -vRS= '!/log-message-[12]/' ORS="\n\n" file 
[DEBUG] date-time class etc, etc 
log-message-3 

[DEBUG] date-time class etc, etc 
log-message-6 
+0

我不知道我明白这是做什么。这并没有指定启动正则表达式。 我注意到,这从我的日志中删除了所有空行。 – fmpdmb 2010-03-18 14:57:23

+0

我仍然不明白这是做什么,但它似乎工作。我相信我可以把这个片段,在一个文件中定义我的一组正则表达式,读取文件,遍历每个执行你的片段的正则表达式,我应该在那里。 – fmpdmb 2010-03-18 16:05:53

+2

该命令将记录分隔符设置为空行,因此从'[..]'到空白行的每个块都被视为1条记录。然后模式搜索没有“log-message-1”或“log-message-2”字样的记录并将其打印出来。这就是全部。 – ghostdog74 2010-03-18 17:14:06

1
(zyx:~) % echo $T 
[DEBUG] date-time class etc, etc 
log-message-1 

[WARN] date-time class etc, etc 
log-message-2 

[DEBUG] date-time class etc, etc 
log-message-3 

[DEBUG] date-time class etc, etc 
log-message-1 

[WARN] date-time class etc, etc 
log-message-2 

[DEBUG] date-time class etc, etc 
log-message-6 
(zyx:~) % echo $T | perl -e '$_=join("", <>); s/\[DEBUG\][^\n]*\n(log-message-1|log-message-2).*?(?=\n\[(DEBUG|WARN)\]|$)//sg; s/\[WARN\].*?(?=\n\[(DEBUG|WARN)\]|$)//sg; print;' 


[DEBUG] date-time class etc, etc 
log-message-3 



[DEBUG] date-time class etc, etc 
log-message-6 
+0

不 - 不 - 不。请不要在'perl中用'$ _ = join(“”,<>)创建multigb字符串;' – osgx 2010-03-18 14:53:45

+0

作者说他有50个MiB文件。如果他说了大约2个GiB文件,我会写其他脚本。 – ZyX 2010-03-18 17:19:02

-1

使用awk或awk样式的perl单线。

+0

当然肯定......假设我是awk或perl专家,我不是 – fmpdmb 2010-03-17 17:47:33

+1

awk是非常容易学习的。你需要一点awk来解析这些文件。 perl可以用简单的语法在相同的awk风格中使用。 – osgx 2010-03-18 14:47:14