当我使用log4j时,我可以创建一个新的类扩展org.apache.log4j.HTMLLayout并覆盖它以生成新的日志格式。使用log4j2时,我只能使用布局但不能覆盖它。在我写的log4j2.xml中
<Appenders>
<File name="log" fileName="D:\log.html" append="false">
<HTMLLayout/>
</File>
</Appenders>
log4j中的我可以使用layout class =&#34; log.FormatHTMLLayout&#34; (log.FormatHTMLLayout是我的新类,它扩展了HTMLLayout),但现在我只能使用HTMLLayout。 有没有办法覆盖HTMLayout?我需要做很多事情,比如更改输出表,标题等等。
答案 0 :(得分:2)
这是我做的, 我需要添加&lt; img&gt; log4j2生成的日志中的HTML标记以及默认的HTML元素(如&lt;,&gt;,“)将替换为转义字符,例如lt;,gt;,quot;。 (参考:https://issues.apache.org/jira/browse/LOG4J2-439)
所以我只是从源代码复制了整个HTMLLayout类,可以在 log4j-core / src / main / java / org / apache / logging / log4j / core / layout
并将其名称更改为“CustomHTMLLayout”并在需要时更新它(您可以选择任何名称),现在您的自定义布局类与HTMLLayout类一样好。
有一种名为 toSerializable 的方法,其中包含每条记录的实际格式,因此您可以根据需要对其进行操作。
修改类后,您需要在log4j2.html中提供新的布局 如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.redknee.bssauto.helpers">
<Appenders>
<RollingFile name="Rolling-default" fileName="logs/bssauto.html" filePattern="logs/$${date:yyyy-MM}/bssauto-%d{MM-dd-yyyy}-%i.log.gz">
<CustomHTMLLayout charset="UTF-8" title="BSSAuto Logs" locationInfo="true" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Rolling-default"/>
</Root>
</Loggers>
</Configuration>
请注意以下
<Configuration packages="com.bssauto.helpers">
这里的包应该包含所有包含布局自定义类的包。所以这里 com.bssauto.helpers 是包,其中我有CustomHTMLLayout类。
<CustomHTMLLayout charset="UTF-8" title="BSSAuto Logs" locationInfo="true" />
通过扩展AbstractStringLayout 创建和 CustomHTMLLayout 自定义布局类
确保您使用的是最新的log4j2版本,我使用 log4j 2.2