我有一堆纯文本的日志文件。这是一个例子...
Overall Failures Log
SW Failures - 03.09.2010 - /logs/swfailures.txt - 23 errors - 24 warnings
HW Failures - 03.09.2010 - /logs/hwfailures.txt - 42 errors - 25 warnings
SW Failures - 03.10.2010 - /logs/swfailures.txt - 32 errors - 27 warnings
HW Failures - 03.10.2010 - /logs/hwfailures.txt - 11 errors - 31 warnings
这些文件可能会变得非常大并且包含许多其他信息。我想从这个日志中生成一个HTML文件,它将添加指向关键部分的链接,并允许用户打开其他日志文件......
SW Failures - 03.09.2010 - <a href="/logs/swfailures.txt">/logs/swfailures.txt</a> - 23 errors - 24 warnings
由于我想添加更多链接和其他html元素,因此大大简化了。我的问题是 - 最好的方法是什么?如果文件很大,我应该在向用户提供之前生成html还是jsp呢?我应该使用perl或其他脚本语言来执行此操作吗?你有什么想法和经历?
答案 0 :(得分:4)
以下是使用Perl的HTML::Template:
的简单示例#!/usr/bin/perl
use strict; use warnings;
use HTML::Template;
my $tmpl = HTML::Template->new(scalarref => \ <<EOTMPL
<!DOCTYPE HTML>
<html><head><title>HTMLized Log</title>
<style type="text/css">
#log li { font-family: "Courier New" }
.errors { background:yellow; color:red }
.warnings { background:#3cf; color:blue }
</style>
</head><body>
<ol id="log">
<TMPL_LOOP LOG>
<li><span class="type"><TMPL_VAR TYPE></span>
<span class="date"><TMPL_VAR DATE></span>
<a href="<TMPL_VAR FILE>"><TMPL_VAR FILE></a>
<span class="errors"><TMPL_VAR ERRORS></span>
<span class="warnings"><TMPL_VAR WARNINGS></span>
</li>
</TMPL_LOOP>
</ol></body></html>
EOTMPL
);
my @log;
my @fields = qw( TYPE DATE FILE ERRORS WARNINGS );
while ( my $entry = <DATA> ) {
chomp $entry;
last unless $entry =~ /\S/;
my %entry;
@entry{ @fields } = split / - /, $entry;
push @log, \%entry;
}
$tmpl->param(LOG => \@log);
print $tmpl->output;
__DATA__
SW Failures - 03.09.2010 - /logs/swfailures.txt - 23 errors - 24 warnings
HW Failures - 03.09.2010 - /logs/hwfailures.txt - 42 errors - 25 warnings
SW Failures - 03.10.2010 - /logs/swfailures.txt - 32 errors - 27 warnings
HW Failures - 03.10.2010 - /logs/hwfailures.txt - 11 errors - 31 warnings
答案 1 :(得分:2)
我喜欢awk,因为它有自动字段解析功能:
/failures.txt/ {
$6="<a href=\"" $6 "\">" $6 "</a><br>"
}
{
print
}
答案 2 :(得分:1)
我使用python正则表达式。
>>> import re
>>> a = re.compile(r'[SH]W Failures - \d\d.\d\d.\d\d\d\d - (.*) - \d+ errors -
\d+ warnings')
>>> str = 'SW Failures - 03.09.2010 - /logs/swfailures.txt - 23 errors - 24 warnings'
>>> b = a.match(str)
>>> b
<_sre.SRE_Match object at 0x7ff34160>
>>> b.groups()
('/logs/swfailures.txt',)
>>> str.replace(b.group(1), '<a href="%s">%s</a>' % (b.group(1), b.group(1)))
'SW Failures - 03.09.2010 - <a href="/logs/swfailures.txt">/logs/swfailures.txt</a> - 23 errors - 24 warnings'
答案 3 :(得分:0)
pygmentize
可以处理某些格式,但在大多数情况下你可能需要为自定义词法分析器添加。