Log4j2:如何使用HtmlLayout附加到HTML日志

时间:2018-08-25 12:38:26

标签: log4j2

我正在使用log4j2创建html日志文件。当我第一次执行代码时,日志被格式化为表格。但是,在第二次执行数据时,并没有将数据追加到表中,而是将数据逐行存储在表下。有没有办法将日志追加到现有表中?

<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>

这是日志文件

Screenshot of log file

1 个答案:

答案 0 :(得分:1)

不幸的是,我认为答案是无法使用log4j2提供的HtmlLayout做自己想做的事情。看来HtmlLayout打算在每次执行时生成单个html文件。

如果您查看source code for 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());
}

由于您可以看到getHeader中的开始html标签和getFooter中的结束标签,因此代码显然希望每次创建一个新的html文档。

您可以write your own layout做您想做的事情,但是您要面对的问题是确定何时编写页脚。在完全完成文件操作之前,您不需要编写页脚,因此,您将必须以某种方式实现一种检测这种情况的方法(假设您想在日志中使用干净的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" />

希望这会有所帮助!