You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改Log4j2 HTML布局中时间列的显示格式?

解决Log4j2 HTML布局自定义时间格式的问题

哈哈,这个坑我踩过!Log4j2原生的HTMLLayout确实没开放pattern属性来直接修改时间格式,不过有两个实用的办法能搞定,我给你唠唠:

方案一:自定义扩展HTMLLayout类

如果你想保留原生HTMLLayout自带的样式和结构,只是单纯修改时间格式,最直接的方式就是继承原生类,重写时间格式化的方法。

步骤1:编写自定义布局类

创建一个Java类,继承org.apache.logging.log4j.core.layout.HtmlLayout,重写formatTimestamp方法,把时间格式改成你要的dd-MM-yyyy:HH:mm:ss.sssZ

import org.apache.logging.log4j.core.layout.HtmlLayout;
import org.apache.logging.log4j.core.LogEvent;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class CustomHtmlLayout extends HtmlLayout {
    // 定义你需要的时间格式
    private static final String CUSTOM_DATE_FORMAT = "dd-MM-yyyy:HH:mm:ss.SSSZ";
    private final SimpleDateFormat dateFormatter;

    public CustomHtmlLayout() {
        super();
        dateFormatter = new SimpleDateFormat(CUSTOM_DATE_FORMAT);
        // 可以根据需求设置时区,比如UTC或者本地时区
        dateFormatter.setTimeZone(TimeZone.getDefault());
    }

    @Override
    protected String formatTimestamp(final LogEvent event) {
        // 用自定义格式格式化日志时间
        return dateFormatter.format(event.getTimeMillis());
    }
}

步骤2:在Log4j2配置中使用自定义类

修改你的log4j2.xml(或其他配置文件),把原来的HtmlLayout替换成你自定义的类:

<Configuration status="INFO">
    <Appenders>
        <File name="HtmlLogFile" fileName="logs/app_log.html">
            <!-- 这里用自定义的布局类路径 -->
            <CustomHtmlLayout charset="UTF-8" />
        </File>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="HtmlLogFile" />
        </Root>
    </Loggers>
</Configuration>

注意:要确保这个自定义类在项目的类路径下,Log4j2才能正确加载它。

方案二:用PatternLayout手动构建HTML日志

如果不想写Java代码,纯配置就能搞定的话,推荐用PatternLayout来自己拼接HTML结构——它支持完全自定义的时间格式,灵活性拉满。

配置示例

log4j2.xml里这样配置,直接生成带自定义时间格式的HTML日志:

<Configuration status="INFO">
    <Appenders>
        <File name="HtmlLogFile" fileName="logs/app_log.html">
            <PatternLayout>
                <!-- 日志文件的HTML头部,只会在文件创建时写入一次 -->
                <Header>
                    <![CDATA[
                    <!DOCTYPE html>
                    <html>
                    <head>
                        <title>Application Logs</title>
                        <style>
                            table { border-collapse: collapse; width: 100%; margin: 10px 0; }
                            th { background-color: #f5f5f5; padding: 8px; text-align: left; border: 1px solid #ddd; }
                            td { padding: 8px; border: 1px solid #ddd; }
                            .info { color: #2ecc71; }
                            .warn { color: #f39c12; }
                            .error { color: #e74c3c; }
                        </style>
                    </head>
                    <body>
                    <h2>Application Log Records</h2>
                    <table>
                        <tr>
                            <th>Timestamp</th>
                            <th>Level</th>
                            <th>Logger</th>
                            <th>Message</th>
                        </tr>
                    ]]>
                </Header>
                <!-- 每条日志事件对应的HTML行,这里用%d指定自定义时间格式 -->
                <Pattern>
                    <![CDATA[
                    <tr>
                        <td>%d{dd-MM-yyyy:HH:mm:ss.SSSZ}</td>
                        <td class="%level">%level</td>
                        <td>%logger{36}</td>
                        <td>%message</td>
                    </tr>
                    ]]>
                </Pattern>
                <!-- 日志文件的HTML尾部 -->
                <Footer>
                    <![CDATA[
                    </table>
                    </body>
                    </html>
                    ]]>
                </Footer>
            </PatternLayout>
        </File>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="HtmlLogFile" />
        </Root>
    </Loggers>
</Configuration>

这个方案的好处是:不用写任何Java代码,完全通过配置实现,还能自定义HTML的样式(比如给不同日志级别加颜色),时间格式直接用%d{你的格式}就能搞定,非常方便。

总结

  • 如果想保留原生HTMLLayout的默认样式,选方案一
  • 如果想完全自定义HTML结构和样式,纯配置解决,选方案二

内容的提问来源于stack exchange,提问作者Chaitrali Patne

火山引擎 最新活动