SpringBoot | 第二十五章:日志管理之自定义Appender (2)

自定义Appender时,可以按实现的功能,适当的继承(log4j2的appender类基本上被设置成了final无法继承)或者参考一些已有的功能,当然了也可以直接继承其基类接口的。以下就简单的示例下,没有实现特定的功能,⊙﹏⊙‖∣

log4j2自定义Appender

按官网的扩展说明,我们来简单实现一个appender。

extend appender

官网地址:

0.编写自定义appender类,继承AbstractAppender抽象实现类:

MyLog4j2Appender.java

/** * 自定义log4j2输出源,简单的输出到控制台 * @author oKong * */ //这里的 MyLog4j2 对应就是 xml中, /** * * <appenders> * <MyLog4j2 printString="一枚趔趄的猿"> * </MyLog4j2> * </appenders> * */ @Plugin(name = "MyLog4j2", category = "Core", elementType = "appender", printObject = true) public class MyLog4j2Appender extends AbstractAppender { String printString; /** *构造函数 可自定义参数 这里直接传入一个常量并输出 * */ protected MyLog4j2Appender(String name, Filter filter, Layout<? extends Serializable> layout,String printString) { super(name, filter, layout); this.printString = printString; } @Override public void append(LogEvent event) { if (event != null && event.getMessage() != null) { // 此处自定义实现输出 // 获取输出值:event.getMessage().toString() // System.out.print(event.getMessage().toString()); // 格式化输出 System.out.print(printString + ":" + getLayout().toSerializable(event)); } } /** 接收配置文件中的参数 * * @PluginAttribute 字面意思都知道,是xml节点的attribute值,如<oKong></oKong> 这里的name 就是 attribute * @PluginElement:表示xml子节点的元素, * 如 * <oKong> * <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> * </oKong> * 其中,PatternLayout就是 的 Layout,其实就是{@link Layout}的实现类。 */ @PluginFactory public static MyLog4j2Appender createAppender( @PluginAttribute("name") String name, @PluginElement("Filter") final Filter filter, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginAttribute("printString") String printString) { if (name == null) { LOGGER.error("no name defined in conf."); return null; } //默认使用 PatternLayout if (layout == null) { layout = PatternLayout.createDefaultLayout(); } return new MyLog4j2Appender(name, filter, layout, printString); } @Override public void start() { System.out.println("log4j2-start方法被调用"); super.start(); } @Override public void stop() { System.out.println("log4j2-stop方法被调用"); super.stop(); } }

简单说明下,相关注意点:

@Plugin注解:这个注解,是为了在之后配置log4j2-spring.xml时,指定的Appender Tag。

构造函数:除了使用父类的以外,也可以增加一些自己的配置。

重写append()方法:这里面需要实现具体的逻辑,日志的去向。

createAppender()方法:主要是接收log4j2-spring.xml中的配置项。

1.使用自定义的appender。

log4j2-spring.xml

<?xml version="1.0" encoding="UTF-8"?> <configuration status="WARN" monitorInterval="30" packages="cn.lqdev.learning"> <!--定义appenders--> <appenders> <MyLog4j2 printString="一枚趔趄的猿(log4j2)"> <!--输出日志的格式--> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/> </MyLog4j2> </appenders> <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--> <loggers> <!--过滤掉spring和mybatis的一些无用的DEBUG信息--> <logger level="INFO"></logger> <logger level="INFO"></logger> <!-- 自定义包下设置为INFO,则可以看见输出的日志不包含debug输出了 --> <logger level="INFO"/> <root level="all"> <appender-ref ref="oKong"/> </root> </loggers> </configuration>

这里需要注意,需要在configuration中,加入属性packages为自定类所在包名cn.lqdev.learning才会被扫描生效,不知道是否还有其他方法。

2.启动后,就可以看见相关输出了。

...部分省略... 一枚趔趄的猿(log4j2):[14:47:43:751] [INFO] - org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:180) - Using a shared selector for servlet write/read 一枚趔趄的猿(log4j2):[14:47:43:761] [INFO] - org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:216) - Tomcat started on port(s): 8080 (http) 一枚趔趄的猿(log4j2):[14:47:43:764] [INFO] - org.springframework.boot.StartupInfoLogger.logStarted(StartupInfoLogger.java:57) - Started Chapter25Application in 2.03 seconds (JVM running for 3.164) 一枚趔趄的猿(log4j2):[14:47:43:764] [INFO] - cn.lqdev.learning.springboot.chapter25.Chapter25Application.main(Chapter25Application.java:14) - Chapter25启动!

不知道如何整合log4j2的,可以查看:《第二十三章:日志管理之整合篇》

logback自定义Appender

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfyxp.html