[英]Log4j2 custom layout
我正在使用 Log4j2 和PatternLayout
。 是否可以編寫我自己的擴展AbstractStringLayout
的Layout
,以便我可以自定義我的輸出消息?
我已經閱讀了文檔,但我只看到了布局的變化 - 沒有自定義的。
是的,這是可能的
您可以使用自定義AbstractStringLayout
或LogEventPatternConverter
例如:抽象字符串布局
@Plugin(name = "NewCustLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public class NewCustLayout extends AbstractStringLayout
{
protected NewCustLayout( Charset charset )
{
super( charset );
}
@Override public String toSerializable( LogEvent event )
{
return null;
}
}
例如: LogEventPatternConverter
@Plugin(name = "NewLayoutConverter", category = "Converter")
@ConverterKeys({"custLayConv"})
public class NewLayoutConverter extends LogEventPatternConverter
{
/**
* Constructs an instance of LoggingEventPatternConverter.
*
* @param name name of converter.
* @param style CSS style for output.
*/
protected NewLayoutConverter( String name, String style )
{
super( name, style );
}
@Override public void format( LogEvent event, StringBuilder toAppendTo )
{
}
}
確保您的配置文件包含所有自定義插件所在的包,
包=“logging.log4j.custom.plugins”
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Configuration packages="logging.log4j.custom.plugins" name="SOME NAME">
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d{MM-dd-yyyy HH:mm:ss,SSS} [%t] %custLayConv %msg%n"/>
</Console>
<RollingRandomAccessFile name="example" fileName="${sys:tbx.log.path}example.log" filePattern="${sys:tbx.log.path}example.log.%i" append="true" immediateFlush="true" bufferSize="262144">
<NewCustLayout pattern="%d{MM-dd-yyyy HH:mm:ss,SSS} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy fileIndex="max" min="1" max="100" compressionLevel="3"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<logger name="logger" level="INFO" additivity="false">
<AppenderRef ref="example" level="INFO"/>
</logger>
<Root level="INFO">
<AppenderRef ref="CONSOLE" level="INFO"/>
</Root>
</Loggers>
</Configuration>
package com.mytest;
@Plugin(name = "MyHtmlLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public class MyHtmlLayout extends AbstractStringLayout{
protected MyHtmlLayout( Charset charset ){
super( charset );
}
@Override
public String toSerializable( LogEvent event ) {
StringBuilder throwable = new StringBuilder();
if (event.getThrown() != null) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println();
event.getThrown().printStackTrace(pw);
pw.close();
throwable.append(sw.toString());
}
StringBuilder retValue=new StringBuilder();
retValue.append("<tr><td>").append(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss:S").format(event.getTimeMillis())).append(" ")
.append(event.getLevel().toString()).append(" ").append(event.getLoggerName()).append(" ").append(event.getMessage().getFormattedMessage()).append(" ").append(throwable).append("</tr></td>\n");
return retValue.toString();
}
@PluginFactory
public static MyHtmlLayout createLayout(@PluginAttribute(value = "charset", defaultString = "UTF-8") Charset charset) {
return new MyHtmlLayout(charset);
}
@Override
public byte[] getHeader() {
return ("<html>\n <body>\n" + "<Table>\n").getBytes();
}
@Override
public byte[] getFooter() {
return ("</table>\n</body>\n</html>").getBytes();
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG" packages="com.mytest" name="NewCustLayout">
<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>-->
<MyHtmlLayout/>
<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="LogToConsole"/>
</Root>
</Loggers>
</Configuration>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.