Мне нужна пользовательская 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
Любая помощь будет оценена по достоинству.