Создание файла .html из файла журнала

Мне нужен сценарий, который преобразует файлы журналов в легко просматриваемые файлы .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"

Моя проблема в том, что вывод, независимо от того, сколько я играю с CAT, GREP, SED и т. Д., Не сохраняет разрывы строк. Очень важно, чтобы выходной файл выглядел более или менее как при выполнении обычного tail -f или cat.


person user2812626    schedule 24.09.2013    source источник
comment
Просто оберните все это в теги <pre> или в свою локальную предпочтительную реализацию CSS.   -  person tripleee    schedule 25.09.2013
comment
Но прежде чем что-либо будет работать, вам нужно заключить в двойные кавычки переменные, которые вы echo.   -  person tripleee    schedule 25.09.2013
comment
также измените все '==' на '='   -  person michael501    schedule 25.09.2013


Ответы (4)


Вместо того, чтобы копировать вещи в переменные (а затем неправильно их цитировать), здесь проводится значительный рефакторинг.

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

Поскольку HTML в любом случае не может отображать цветовые коды терминала, я исключил параметр --color. Если у вас есть подходящий фильтр для перевода в цветные теги HTML, обязательно добавьте его.

Также обратите внимание, что регулярное выражение по умолчанию будет соответствовать всем строкам, если вы не предоставите третий аргумент командной строки.

Многие браузеры будут отображать одинокий открывающий тег <pre> как непривлекательную пустую строку, но исправить это здесь вряд ли необходимо. Выделите его на отдельный echo -n '<pre>', если он вас беспокоит.

person tripleee    schedule 24.09.2013
comment
И моя любимая часть - это лицо: 3:-^} :) - person lurker; 25.09.2013
comment
При использовании pre здесь хорошо то, что можно легко добавить тег класса и изменить текст журнала по своему желанию. - person lurker; 25.09.2013

Поскольку вы переходите на HTML, вам нужно заменить символы разрыва строки (используя sed или что-то еще) на <br/>, разрыв строки HTML. HTML обычно игнорирует символы CR / LF в свободном тексте.

Таким образом, вы можете использовать sed, как показано ниже. Я удалил 1s, поскольку их назначение не объяснено, но вы можете вставить их обратно, если хотите.

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;
person lurker    schedule 24.09.2013
comment
Я не думаю, что сценарий sed для добавления 1 в конце каждой строки на самом деле преднамерен или полезен, но это, конечно, просто предположение. Просто sed 's/$/1/' делает это более лаконично, если это действительно так. - person tripleee; 25.09.2013
comment
@tripleee Я следил за тем, что использовал OP, это все, предполагая, что они настроили его так, как хотели (если не считать работы разрывов строк). Я пояснил это в ответе. - person lurker; 25.09.2013

открытый класс Log4jHTMLlayout расширяет HTMLLayout {защищенный окончательный int BUF_SIZE = 256; защищенный конечный int MAX_CAPACITY = 1024; статическая строка TRACE_PREFIX = "
"; частный StringBuffer sbuf = новый StringBuffer (BUF_SIZE); общедоступная статическая конечная строка LOCATION_INFO_OPTION = "LocationInfo";

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();
}

} строгий текст

person Ravi Kumar    schedule 08.12.2014

Для этой цели вы можете использовать ccat.

Если вы используете Ubuntu, следуйте сначала установите и преобразуйте файл журнала в HTML. файл, как показано ниже.

ccat check_valgrind_log.log --html > check_valgrind_log.html

Я использовал этот пакет для преобразования журнала valgrind в файл html, который дает красивый цветной вывод.

person Nikhil Augustine    schedule 18.08.2018