文章目录
- 写在前面
- 1、自定义LayOut
- 2、log4j2.xml的配置
- 3、测试一下吧
写在前面
log4j2是当前最为主流的java日志框架,其性能及可扩展性要优于其他任意一款日志框架。
当我们想将日志输出为json,或者是其他我们想要的格式需要怎么处理呢?
log4j2入门请移步:学习日志框架之——log4j2入门
1、自定义LayOut
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.AbstractStringLayout;
import org.apache.logging.log4j.message.Message;
import java.nio.charset.Charset;
/**
* log4j2扩展:自定义json格式输出的日志
*/
// 声明插件
@Plugin(name = "MyLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public class MyLayout extends AbstractStringLayout {
protected MyLayout(Charset charset, String attr1, String attr2) {
super(charset);
this.attr1 = attr1;
this.attr2 = attr2;
}
/**
* 插件的创建工厂
*/
@PluginFactory
public static MyLayout createLayout(@PluginAttribute(value = "charset", defaultString = "UTF-8") final Charset charset,
@PluginAttribute(value = "attr1", defaultString = "") final String attr1,
@PluginAttribute(value = "attr2", defaultString = "") final String attr2) {
return new MyLayout(charset, attr1, attr2);
}
private final String attr1;
private final String attr2;
/**
* 自定义日志输出格式
* 该返回值就是我们所见到的日志输出格式,我们可以自定义为json、xml等等任意我们想要的格式
*/
@Override
public String toSerializable(LogEvent event) {
Level level = event.getLevel();
Message message = event.getMessage();
long threadId = event.getThreadId();
// ... event中包含着日志所有的信息
return "attr1:" + attr1 + ";attr2:" + attr2 + ";level:" + level.name() + ";" + ";thread:" + threadId + " -- " + message.getFormattedMessage() + "\n" ;
}
}
2、log4j2.xml的配置
只需要将插件引入即可,使用非常方便!
<!-- 配置控制台输出 -->
<Console name="consoleAppender" target="SYSTEM_OUT">
<MyLayout charset="UTF-8" attr1="aaa" attr2="bbb" />
</Console>
3、测试一下吧
logger.info("info信息");
输出结果:
attr1:aaa;attr2:bbb;level:INFO;;thread:1 – info信息