Log4j2: Как добавить в журнал HTML с помощью HtmlLayout - PullRequest
0 голосов
/ 25 августа 2018

Я создаю html-файлы журналов, используя log4j2.Когда я выполняю свой код в первый раз, журналы форматируются в виде таблицы.Однако при выполнении второго раза данные не добавляются в таблицу, а вместо этого они хранятся построчно под таблицей.Есть ли способ добавить журналы в существующую таблицу?

<Appenders>
    <RollingFile name="fileLogger" fileName="/home/developers/Desktop/exam/app-info.html"
                 filePattern="app-info-%d{yyyy-MM-dd}.html">
        <HTMLLayout charset="UTF-8" title="Howtodoinjava Info Logs" locationInfo="true" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="10" modulate="true" />
            <SizeBasedTriggeringPolicy size="10 MB" />
        </Policies>
    </RollingFile>
    <Console name="console" target="SYSTEM_OUT">
        <PatternLayout   pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
    </Console>
</Appenders>
<Loggers>
    <Logger name="com.howtodoinjava" level="info" additivity="true">
        <appender-ref ref="fileLogger" level="info" />
    </Logger>
    <Root level="debug" additivity="true">
        <appender-ref ref="console" />
               <appender-ref ref="fileLogger" />
    </Root>
</Loggers>

Это файл журнала

Снимок экрана журналафайл

1 Ответ

0 голосов
/ 25 августа 2018

К сожалению, я думаю, что ответ в том, что вы не можете делать то, что хотите, с HtmlLayout, предоставленным log4j2. Похоже, что HtmlLayout предназначался для генерации одного html-файла за одно выполнение.

Если вы посмотрите на исходный код для HtmlLayout , вы увидите следующий код:

@Override
public byte[] getHeader() {
    final StringBuilder sbuf = new StringBuilder();
    append(sbuf, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" ");
    ...
    appendLs(sbuf, "<html>");
    ...
    appendLs(sbuf, "<table ...");
    ...
    return sbuf.toString().getBytes(getCharset());
}

....

@Override
public byte[] getFooter() {
    final StringBuilder sbuf = new StringBuilder();
    appendLs(sbuf, "</table>");
    appendLs(sbuf, "<br>");
    appendLs(sbuf, "</body></html>");
    return getBytes(sbuf.toString());
}

Код явно ожидает создания нового HTML-документа каждый раз, поскольку вы можете видеть открывающие HTML-теги в getHeader и закрывающие теги в getFooter.

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

Если вам не нужен чистый HTML, просто не пишите нижний колонтитул. В этом случае вы можете просто скопировать класс HtmlLayout и слегка изменить его, чтобы создать новый макет, в котором не будет написано нижний колонтитул. Например:

//your package and imports go here
...
@Plugin(name = "NoFooterHtmlLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public final class NoFooterHtmlLayout extends AbstractStringLayout {

    //Various other methods copied from HtmlLayout go here
    ...

    @Override
    public byte[] getFooter() {
        return new byte[0];
    }

    //Various other methods copied from HtmlLayout go here
    ...
}

и затем в вашей конфигурации log4j2 вы будете использовать это:

<NoFooterHtmlLayout charset="UTF-8" title="My Title"
                locationInfo="true" />

Надеюсь, это поможет!

...