我正在使用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>
这是日志文件
答案 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" />
希望这会有所帮助!