2010-03-25 78 views
13

我公司的专有软件生成一个日志文件,如果它被解析,使用起来更容易。我们所使用的日志解析器是由另一名员工编写的一个副项目,它的表现非常糟糕。我应该用什么语言编写文本解析器并以用户友好的方式显示结果?

这些日志文件可以非常快速地增长到10兆字节,如果日志文件大于1兆字节,我们当前使用的解析器就会出现问题。

所以,我想写一个程序,可以在尽可能短的时间内解析这个海量的文本。我们仅使用Windows,所以在Windows上运行是必须的。我们当前的实现运行在本地Web服务器上,我确信将它作为应用程序运行必须更快。

所有的建议都会有帮助。谢谢。

编辑:我的最终目标是解析文本并以更加用户友好的方式用颜色等进行显示。你可以用Perl和Python做到这一点吗?我知道你可以用Java和C++来做到这一点。因此,它将像记事本一样在您打开日志文件的位置运行,但在屏幕上显示用户友好的格式而不是原始文件。

编辑:所以,我不能选择最好的答案,那就是选择一种能够最好地展示我要去做什么的语言,然后在其中编写解析器。另外,使用ANTLR可能会使这个过程更容易。我改变了原来的问题,因为我想我没有问我真正在寻找什么。感谢大家!

+1

我们需要更多信息来帮助您。一些日志样本会很好,以及你如何分析它。 – 2010-03-25 21:59:33

+0

至于我想如何解析它,我已经基本上描述了在我上面的编辑。至于日志文件本身,我不需要解析的帮助,只需选择最好的工具即可。 – HenryAdamsJr 2010-03-25 22:35:40

+2

您应该也可以选择一种语言,以您想要的方式显示文本。显示可能比解析本身更复杂。 – meriton 2010-03-25 22:40:17

回答

14

嗯,“随你知道的去”是一个很好的答案。 Perl是为这种事情设计的(但是imo非常适合简单的解析,但是我个人为了复杂的项目而避免使用它)。

如果它变得有点复杂,为什么不使用正确的语法和语法设置?

莱克斯& Yacc的(或Flex &野牛)映入脑海,但我个人总是会达到Antlr

在模式(语法),和规则的那些话结合来定义各种“字”(文法)和Antlr会吐出一个程序来解析你的输入(你可以使用Java,C,C++等等(你担心解析时间,所以选择一种编译语言)。

我个人觉得乏味的手工工艺解析器,甚至更繁琐的调试他们,但AntlrWorks是一个可爱的IDE,真正使这一块蛋糕...

底部该位是定义一个语法规则。

如果你搞砸了你的语法规则,你会被告知。这不是手工解析器的情况,在那里你只需要划伤你的body part,并想知道“奇怪的结果”...

检查出来。即使你认为你的项目现在微不足道,它也可能会增长。如果你有任何解析兴趣,你至少应该熟悉lex/yacc,但特别是Antlr(Works)

+1

我一定会考虑这个。 ANTLR似乎无论使用什么语言都是非常不错的。 – HenryAdamsJr 2010-03-26 14:52:15

7

我会建议使用Python或Perl。用正则表达式解析大文本文件非常快。

2

我相信perl被认为是解析文本的好选择。

1

Perl适用于文本处理。

很多很好的文本处理程序都是用Perl编写的。 Ack(grep替换)是一个。

+0

downvote for what? – 2010-03-26 02:19:50

0

听起来像是Perl的工作,就像我自己并不特别关心它作为一种语言一样。 ActivePerl是适用于Windows的Perl的合理分布。

3

我用过Python和Perl。 Perl更适合这一点,但可能很难维护。 Python也会这样做,并且更易于阅读。去Python。

+3

但是所有的$ @%都很美!去perl吧! – Cascabel 2010-03-25 22:07:39

+2

@Jefromi - 哈!几个月后,没有什么事情可以回到200线符号汤,试图弄清楚你在想什么。 =) – 2010-03-25 22:30:28

+0

我向帖子中添加了一些信息,以阐明我将如何使用解析的文本。我想要一个GUI来显示日志,但是格式友好。我不认为我见过使用Perl或Python编写的Windows GUI应用程序,但我对它们知之甚少。 – HenryAdamsJr 2010-03-25 22:41:26

2

也许成品如MS LogParserusage podcast here)可能会做你所需要的,它是免费的。

+1

我绝对会建议寻找现有的免费或商业产品来解决问题,无需重新发明轮子。 Splunk是一个流行的日志解析和分析工具,可以接受任意输入:http://www.splunk.com/base/Documentation/latest/Admin/WhatSplunkCanMonitor – 2010-03-25 22:26:20

+1

也是Apache ChainSaw。 – 2010-03-25 23:08:14

-2

c/C++或java ... 的C/C++,我有段可以帮助你:

FILE *f = fopen(file, "rb"); 
if(f == NULL) { 
    return DBDEMON_OPEN_ERROR; // open fail 
} 

for(int i = 0; feof(f) == 0; i++) 

{ 

fscanf(f,"%d %s %s %c\n", &db[i].id, &db[i].name[0], &db[i].uid[0], &db[i].priviledge); 

db_size++; 

} 

fclose(f); 

这是阅读与以下格式的文件:

INT串串字符

1 SOMETHING ANYTHINGž

结构定义如下:

typedef struct { 

    unsigned int id; 
    char  name[DBDEMON_NAME_MAXSIZE]; 
    char  uid[DBDEMON_UID_MAXSIZE]; 
    char  priviledge; 
} DATABASE; 

小心使用fscanf,因为没有检查类型等,可能会导致错误。 但我认为这非常有效。

+0

老兄......你忘了一些这些行上的一些空间...... – SeanJA 2010-03-25 22:51:38

+6

我是C/C++的拥护者 - 甚至我也不会称他们为文本处理的伟大语言。 – 2010-03-25 23:07:11

+0

@Billy - 那么,C++不能很好地处理文本?这是否可以通过如何轻松创建Windows GUI来平衡? – HenryAdamsJr 2010-03-25 23:18:38

9

你应该使用你知道的语言......除非你有很多时间来完成这个项目,你还可以花时间学习一门新的语言。

+1

这是总是正确的答案,当问题是“我应该用什么语言来做X?”即使语言对你所做的事情不是很好,如果你不了解更好的语言,你最好坚持你认识的严肃的项目。 – 2010-03-25 23:09:06

+1

这是一个很好的建议,如果在某个特定的时间段内需要这样做,我会同意,但我会用这个项目作为借口来学习新的东西。阅读所有答案后,看起来语言在很大程度上不会让这个速度变得更快或更慢。我目前倾向于C++,因为我知道我可以用它创建一个Windows GUI,并且我想将它添加到我的库中。 – HenryAdamsJr 2010-03-25 23:15:30

4

无论您的同事使用何种语言。我可以告诉你,任何宏汇编程序都可以让你编写能够翻录你的数据的代码,但是,严格来说,你会花几个月的时间写程序集来节省几秒钟的CPU时间吗?重写一个程序是有趣,但它不是practical。)

鞭掉你的分析器,指出你的可怕的执行日志分析器,并修复性能问题。如果这是一种通用语言,这里会有人能够提供帮助。

+0

它不会节省几秒钟。如果我做得对,它会节省几分钟。在目前的实施中,如果文件足够大,则根本不会返回。我觉得他的实现从头到尾都是错误的,无论如何我无法访问源代码。 – HenryAdamsJr 2010-03-26 14:48:20

0

我建议Perl。它实际上是为解析日志文件而构建的。至于输出我同意ghostdog74,HTML是要走的路。 Perl有几十个模块,允许您构建和/或模板HTML。

我会使用正则表达式解析出数据,然后使用Template :: Toolkit(在CPAN上)使用HTML和CSS模板创建漂亮的页面。

2

在尽可能最短的时间内解析大量的文本。

考虑PADS Project从AT & T.这是一个专用语言,兼容C,这正是设计的日志文件特设数据格式高速解析。甚至有一个功能可以尝试从例子中学习你的日志格式,虽然我不知道它是否已经达到了产量。项目背后的人非常聪明,在电话公司中产生了很大的影响。 PADS在产生千兆字节的数据流上提供非常高的性能。乔鲍勃说,检查出来。

如果“可能的最短时间内的海量文本为”,Perl和Python不是答案。但是如果你需要匆匆而过,并且可以花更长时间,那么Perl和Python也可以。兆字节实际上并不是那么大。

+0

有趣的寿。它将代码转换为C库。 – 3manuek 2016-09-20 16:32:28

相关问题