代码之家  ›  专栏  ›  技术社区  ›  Michael Balint

将日志文件(*.txt)转换为Web友好文件(*.html、*.jsp等的最佳方法?

  •  4
  • Michael Balint  · 技术社区  · 15 年前

    我有一堆纯文本的日志文件。下面是一个例子…

    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或其他脚本语言来实现这一点吗?你的想法和经历是什么?

    4 回复  |  直到 15 年前
        1
  •  4
  •   Sinan Ünür    15 年前

    下面是一个使用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
    
        2
  •  2
  •   lhf    15 年前

    我喜欢awk,因为它具有自动字段分析功能:

    /failures.txt/ {
            $6="<a href=\"" $6 "\">" $6 "</a><br>"
    }
    
    {
            print
    }
    
        3
  •  1
  •   Pierre-Antoine LaFayette    15 年前

    我将使用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'
    
        4
  •  0
  •   Ignacio Vazquez-Abrams    15 年前

    pygmentize 可以处理一些格式,尽管在大多数情况下您可能需要创建自定义的lexer。