Пользовательский макет HTML с использованием Log4j2

Мне нужна пользовательская html-страница с генерируемыми журналами.

По сути, все, что я делаю, это создаю собственный макет с помощью плагинов, расширяющих AbstractStringLayout.

@Plugin(name = "MyAppender", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
public class MyAppender extends AbstractStringLayout {
    public static final String DEFAULT_FONT_FAMILY = "arial,sans-serif";

    public MyAppender(Charset charset) {
        super(charset);
    }

    @PluginFactory
    public static MyAppender createLayout(
            @PluginAttribute(value = "charset", defaultString = "UTF-8") Charset charset) {
        return new MyAppender(charset);
    }

    private StringBuilder appendLs(final StringBuilder sbuilder, final String s) {
        sbuilder.append(s).append(Strings.LINE_SEPARATOR);
        return sbuilder;
    }

    private StringBuilder append(final StringBuilder sbuilder, final String s) {
        sbuilder.append(s);
        return sbuilder;
    }

    @Override
    public byte[] getHeader() {
        final StringBuilder sbuf = new StringBuilder();
        append(sbuf, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" ");
        appendLs(sbuf, "\"http://www.w3.org/TR/html4/loose.dtd\">");
        appendLs(sbuf, "<html>");
        appendLs(sbuf, "<head>");
        append(sbuf, "<meta charset=\"");
        append(sbuf, getCharset().toString());
        appendLs(sbuf, "\"/>");
        append(sbuf, "<title>").append("test");
        appendLs(sbuf, "</title>");
        appendLs(sbuf, "<style type=\"text/css\">");
        appendLs(sbuf, "<!--");
        append(sbuf, "body, table {font-family:").append("serif").append("; font-size: ");
//      appendLs(sbuf, headerSize).append(";}");
        appendLs(sbuf, "th {background: #336699; color: #FFFFFF; text-align: left;}");
        appendLs(sbuf, "-->");
        appendLs(sbuf, "</style>");
        appendLs(sbuf, "</head>");
        appendLs(sbuf, "<body bgcolor=\"#FFFFFF\" topmargin=\"6\" leftmargin=\"6\">");
        appendLs(sbuf, "<hr size=\"1\" noshade=\"noshade\">");
        appendLs(sbuf, "Log session start time " + new java.util.Date() + "<br>");
        appendLs(sbuf, "<br>");
        appendLs(sbuf,
                "<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\" bordercolor=\"#224466\" width=\"100%\">");
        appendLs(sbuf, "<tr>");
        appendLs(sbuf, "<th>Logger</th>");
//      if (locationInfo) {
//          appendLs(sbuf, "<th>File:Line</th>");
//      }
//      appendLs(sbuf, "<th>Message</th>");
        appendLs(sbuf, "</tr>");
        return sbuf.toString().getBytes(getCharset());
    }
    

    public String toSerializable(final LogEvent event) {
        final StringBuilder sbuf = new StringBuilder();
        sbuf.append("<tr>");
        sbuf.append(Strings.LINE_SEPARATOR).append("<tr>").append(Strings.LINE_SEPARATOR);
        sbuf.append("<td>").append("Log Generated");
        sbuf.append("</td>").append(Strings.LINE_SEPARATOR);
        sbuf.append("</tr>");
        return sbuf.toString();
        
    }
    
    
    @Override
    public byte[] getFooter() {
        final StringBuilder sbuf = new StringBuilder();
        appendLs(sbuf, "</table>");
        appendLs(sbuf, "<br>");
        appendLs(sbuf, "</body></html>");
        return getBytes(sbuf.toString());
    }

}

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG" packages="com.demo.main"
    name="MyAppender">
    <Appenders>
        <Console name="LogToConsole" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>

        <RollingFile name="LogToRollingFile"
            fileName="logs/app.html"
            filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
            </PatternLayout>
            <MyAppender name="MyAppender"/>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="100 MB" />
            </Policies>
            <DefaultRolloverStrategy max="100" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <!-- avoid duplicated logs with additivity=false -->
        <Logger name="com.psx.logtest" level="debug" additivity="false">
            <AppenderRef ref="LogToRollingFile" />
        </Logger>
        <Root level="error">
            <AppenderRef ref="LogToRollingFile" />
        </Root>
    </Loggers>
</Configuration>

И наконец

public class MainController {
    private static final Logger logger = LogManager.getLogger(MainController.class);

    
    public static void main(String[] args) {
        System.out.println("Hey there, logging using log4j2");
        logger.trace("tracing");
        logger.debug("debugging");
        logger.info("For your info!");
        logger.warn("Warnings");
        logger.error("Errors");
        logger.fatal("Fatal");
    
    }
}

Мне нужно создать пользовательские HTML-страницы с журналами. И я не могу получить logevent. то есть toSerializable(Logevent event) никогда не вызывается. Вызываются методы getHeader и getFooter. Но я не могу зафиксировать событие.

Я сослался на ответ @RajaJanapati для создания customLayout

Любая помощь будет оценена по достоинству.


person Waseem    schedule 27.04.2021    source источник