问题描述
基本上,我所做的就是使用扩展 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,"</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 generation 的回答
任何帮助将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)