从日志文件创建.html文件

从日志文件创建.html文件,html,bash,grep,cat,Html,Bash,Grep,Cat,我需要一个脚本,将日志文件转换为易于查看的.html文件,可由“任何人”访问 以下是我到目前为止的情况: #!/bin/bash ## The purpose of this script is to create .html files from log files, with the ability to optionally GREP for certain strings if [ "$2" == "" ]; then echo "Usage : $0 [Source

我需要一个脚本,将日志文件转换为易于查看的.html文件,可由“任何人”访问

以下是我到目前为止的情况:

#!/bin/bash

## The purpose of this script is to create .html files from log files, with the ability to optionally GREP for certain strings

if [ "$2" == "" ];
then
        echo "Usage : $0 [Source Log file] [Output HTML file] [String to grep (if applicable)]"
        exit 255
fi;

LOGFILE=$1
OUTPUTFILE=$2
GREPSTRING=$3

if [ "$3" == "" ];
then
        echo "Cat'ing $LOGFILE to $OUTPUTFILE"
        LOGCONTENTS=`cat $LOGFILE`

else
        echo "Grep'ing for $GREPSTRING in $LOGFILE"
        LOGCONTENTS=`grep --color $GREPSTRING $LOGFILE | sed -e "s/^.*$/&1\n/"`
fi;

# Below is the html heading which will be appended to the final .html file
HEADING="<html><body><h1>Log output for: $LOGFILE</h1>"

# Below is the end of the html file
END="</body></html>"

# Below all the prepared variables are stitched together to the OUTPUT/LOG FILE
echo $HEADING > $OUTPUTFILE
echo $LOGCONTENTS >> $OUTPUTFILE
echo $END >> $OUTPUTFILE


# For debugging, enable the lines below
echo $LOGCONTENTS
echo "Done preparing $OUTPUTFILE"
#/bin/bash
##此脚本的目的是从日志文件创建.html文件,并能够选择性地对某些字符串进行GREP
如果[“$2”=”;
然后
echo“用法:$0[源日志文件][输出HTML文件][字符串到grep(如果适用)]”
255出口
fi;
日志文件=$1
OUTPUTFILE=$2
GREPSTRING=3美元
如果[“$3”=”;
然后
回显“Cat'ing$LOGFILE到$OUTPUTFILE”
LOGCONTENTS=`cat$LOGFILE`
其他的
回显“Grep'ing for$GREPSTRING in$LOGFILE”
LOGCONTENTS=`grep--color$GREPSTRING$LOGFILE | sed-e“s/^.*$/&1\n/”`
fi;
#下面是将附加到最终.html文件的html标题
HEADING=“日志输出:$LOGFILE”
#下面是html文件的结尾
END=“”
#下面,将所有准备好的变量缝合到输出/日志文件中
echo$HEADING>$OUTPUTFILE
echo$LOGCONTENTS>>$OUTPUTFILE
echo$END>>$OUTPUTFILE
#要进行调试,请启用下面的行
echo$LOGCONTENTS
echo“准备完$OUTPUTFILE”

我的问题是,无论我如何使用CAT、GREP、SED等,输出都不会保留换行符。输出文件的外观与正常的tail-f或cat差不多,这一点很重要。

因为您要使用HTML,所以需要将换行符(使用
sed
或其他任何字符)替换为

,即HTML换行符。HTML通常忽略自由流动文本中的CR/LF字符

因此,您可以使用下面的
sed
。我删除了
1
s,因为没有解释它们的用途,但是如果需要,您可以将它们放回

if [ "$3" == "" ];
then
        echo "Cat'ing $LOGFILE to $OUTPUTFILE"
        LOGCONTENTS=`sed -e "s/^.*$/&<br\/>/" $LOGFILE`

else
        echo "Grep'ing for $GREPSTRING in $LOGFILE"
        LOGCONTENTS=`grep --color $GREPSTRING $LOGFILE | sed -e "s/^.*$/&<br\/>/"`
fi;
如果[“$3”=”;
然后
回显“Cat'ing$LOGFILE到$OUTPUTFILE”
LOGCONTENTS=`sed-e“s/^.$/&/“$LOGFILE`
其他的
回显“Grep'ing for$GREPSTRING in$LOGFILE”
LOGCONTENTS=`grep--color$GREPSTRING$LOGFILE | sed-e“s/^.*$/&”`
fi;

这里不是将内容复制到变量中(然后错误引用),而是一个重要的重构

#!/bin/sh
exec >"$2"
cat <<HERE
<html><body><h1>Log output for: $1</h1>
<pre>
HERE
grep "${3:-^}" "$1"
echo '</pre></body></html>'
#/垃圾箱/垃圾箱
exec>“$2”

cat公共类Log4jHTMLlayout扩展了HTMLLayout{ 受保护的最终int BUF_大小=256; 受保护的最终int最大容量=1024; 静态字符串跟踪_前缀=“
”; 私有StringBuffer sbuf=新StringBuffer(BUF_大小); 公共静态最终字符串位置\u INFO\u OPTION=“LocationInfo”

公共字符串格式(LoggingEvent事件){
如果(sbuf.capacity()>最大容量){
sbuf=新的StringBuffer(BUF_大小);
}否则{
sbuf.setLength(0);
}
sbuf.append(Layout.LINE_SEP+“”+Layout.LINE_SEP);
sbuf.追加(“”);
Calendar cal=Calendar.getInstance();
//append(event.timeStamp-LoggingEvent.getStartTime());
Timestamp stmp=新的时间戳(cal.getTimeInMillis());
sbuf.append(stmp.toString());
sbuf.append(“+Layout.LINE_SEP”);
字符串escapedThread=Transform.escapeTags(event.getThreadName());
sbuf.追加(“”);
追加(转义线程);
sbuf.append(“+Layout.LINE_SEP”);
sbuf.追加(“”);
if(event.getLevel().equals(Level.DEBUG)){
sbuf.追加(“”);
append(Transform.escapeTags(String.valueOf(event.getLevel()));
sbuf.追加(“”);
}else if(event.getLevel().isgreaterequal(Level.WARN)){
sbuf.追加(“”);
append(Transform.escapeTags(String.valueOf(event.getLevel()));
sbuf.追加(“”);
}否则{
append(Transform.escapeTags(String.valueOf(event.getLevel()));
}
sbuf.append(“+Layout.LINE_SEP”);
String escapedLogger=Transform.escapeTags(event.getLoggerName());
sbuf.追加(“”);
sbuf.append(转义记录器);
sbuf.append(“+Layout.LINE_SEP”);
if(getLocationInfo()){
LocationInfo locInfo=event.getLocationInformation();
sbuf.追加(“”);
追加(Transform.escapeTags(locInfo.getFileName());
sbuf.append(':');
追加(locInfo.getLineNumber());
sbuf.append(“+Layout.LINE_SEP”);
}
sbuf.追加(“”);
追加(Transform.escapeTags(event.getRenderedMessage());
sbuf.append(“+Layout.LINE_SEP”);
sbuf.append(“+Layout.LINE_SEP”);
if(event.getNDC()!=null){
sbuf.追加(“”);
追加(“NDC:+Transform.escapeTags(event.getNDC()));
sbuf.append(“+Layout.LINE_SEP”);
}
字符串[]s=event.getThrowableStrRep();
如果(s!=null){
sbuf.追加(“”);
附录THROWABLEASHTML(s、sbuf、true);
sbuf.append(“+Layout.LINE_SEP”);
}
返回sbuf.toString();
}
public void appendThrowableAsHTML(字符串[]s,字符串缓冲区sbuf,布尔值isAppend){
如果(s!=null){
int len=s.长度;
如果(len==0)
返回;
sbuf.append(Transform.escapeTags(s[0]);
sbuf.append(布局。行_SEP);
对于(int i=1;i”+Layout.LINE\u SEP);
追加(“日志会话开始时间”+new java.util.Date()+”
“+Layout.LINE_SEP); sbuf.append(“
”+布局行_SEP); sbuf.append(“+Layout.LINE_SEP”); sbuf.append(“+Layout.LINE_SEP”); sbuf.append(“时间”+布局行_SEP); sbuf.append(“线程”+布局
public String format(LoggingEvent event) {

    if (sbuf.capacity() > MAX_CAPACITY) {
        sbuf = new StringBuffer(BUF_SIZE);
    } else {
        sbuf.setLength(0);
    }

    sbuf.append(Layout.LINE_SEP + "<tr>" + Layout.LINE_SEP);

    sbuf.append("<td>");
    Calendar cal=Calendar.getInstance();
    //sbuf.append(event.timeStamp - LoggingEvent.getStartTime());
    Timestamp stmp=new Timestamp(cal.getTimeInMillis());
    sbuf.append(stmp.toString());
    sbuf.append("</td>" + Layout.LINE_SEP);

    String escapedThread = Transform.escapeTags(event.getThreadName());
    sbuf.append("<td title=\"" + escapedThread + " thread\">");
    sbuf.append(escapedThread);
    sbuf.append("</td>" + Layout.LINE_SEP);

    sbuf.append("<td title=\"Level\">");
    if (event.getLevel().equals(Level.DEBUG)) {
        sbuf.append("<font color=\"#339933\">");
        sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
        sbuf.append("</font>");
    } else if (event.getLevel().isGreaterOrEqual(Level.WARN)) {
        sbuf.append("<font color=\"#993300\"><strong>");
        sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
        sbuf.append("</strong></font>");
    } else {
        sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
    }
    sbuf.append("</td>" + Layout.LINE_SEP);

    String escapedLogger = Transform.escapeTags(event.getLoggerName());
    sbuf.append("<td title=\"" + escapedLogger + " category\">");
    sbuf.append(escapedLogger);
    sbuf.append("</td>" + Layout.LINE_SEP);

    if (getLocationInfo()) {
        LocationInfo locInfo = event.getLocationInformation();
        sbuf.append("<td>");
        sbuf.append(Transform.escapeTags(locInfo.getFileName()));
        sbuf.append(':');
        sbuf.append(locInfo.getLineNumber());
        sbuf.append("</td>" + Layout.LINE_SEP);
    }

    sbuf.append("<td title=\"Message\">");
    sbuf.append(Transform.escapeTags(event.getRenderedMessage()));
    sbuf.append("</td>" + Layout.LINE_SEP);
    sbuf.append("</tr>" + Layout.LINE_SEP);

    if (event.getNDC() != null) {
        sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size : xx-small;\" colspan=\"6\" title=\"Nested Diagnostic Context\">");
        sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));
        sbuf.append("</td></tr>" + Layout.LINE_SEP);
    }

    String[] s = event.getThrowableStrRep();
    if (s != null) {
        sbuf.append("<tr><td bgcolor=\"#993300\" style=\"color:White; font-size : xx-small;\" colspan=\"6\">");
        appendThrowableAsHTML(s, sbuf,true);
        sbuf.append("</td></tr>" + Layout.LINE_SEP);
    }

    return sbuf.toString();

}

public void appendThrowableAsHTML(String[] s, StringBuffer sbuf,boolean isAppend) {
         if(s != null) {
           int len = s.length;
           if(len == 0)
               return;
           sbuf.append(Transform.escapeTags(s[0]));
           sbuf.append(Layout.LINE_SEP);
           for(int i = 1; i < len; i++) {
                sbuf.append(TRACE_PREFIX);
                sbuf.append(Transform.escapeTags(s[i]));
                sbuf.append(Layout.LINE_SEP);
           }
       }
}
public String getHeader() {
    StringBuffer sbuf = new StringBuffer();
    sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">" + Layout.LINE_SEP);
    sbuf.append("<html>" + Layout.LINE_SEP);
    sbuf.append("<head>" + Layout.LINE_SEP);
    sbuf.append("<title>" + getTitle() + "</title>" + Layout.LINE_SEP);
    sbuf.append("<style type=\"text/css\">" + Layout.LINE_SEP);
    sbuf.append("<!--" + Layout.LINE_SEP);
    sbuf.append("body, table {font-family: arial,sans-serif; font-size: x-small;}" + Layout.LINE_SEP);
    sbuf.append("th {background: #336699; color: #FFFFFF; text-align: left;}" + Layout.LINE_SEP);
    sbuf.append("-->" + Layout.LINE_SEP);
    sbuf.append("</style>" + Layout.LINE_SEP);
    sbuf.append("</head>" + Layout.LINE_SEP);
    sbuf.append("<body bgcolor=\"#FFFFFF\" topmargin=\"6\" leftmargin=\"6\">" + Layout.LINE_SEP);
    sbuf.append("<hr size=\"1\" noshade>" + Layout.LINE_SEP);
    sbuf.append("Log session start time " + new java.util.Date() + "<br>" + Layout.LINE_SEP);
    sbuf.append("<br>" + Layout.LINE_SEP);
    sbuf.append("<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\" bordercolor=\"#224466\" width=\"100%\">" + Layout.LINE_SEP);
    sbuf.append("<tr>" + Layout.LINE_SEP);
    sbuf.append("<th>Time</th>" + Layout.LINE_SEP);
    sbuf.append("<th>Thread</th>" + Layout.LINE_SEP);
    sbuf.append("<th>Level</th>" + Layout.LINE_SEP);
    sbuf.append("<th>Category</th>" + Layout.LINE_SEP);
    if (getLocationInfo()) {
        sbuf.append("<th>File:Line</th>" + Layout.LINE_SEP);
    }
    sbuf.append("<th>Message</th>" + Layout.LINE_SEP);
    sbuf.append("</tr>" + Layout.LINE_SEP);
    return sbuf.toString();
}
ccat check_valgrind_log.log --html > check_valgrind_log.html