1. 继承AppenderBase就可以轻松地写自己的appender。AppenderBase处理过滤器、状态信息和大多数appender共享的其他功能。派生类只需要实现一个append(Object
eventObject)方法。
2. 例子
2.1. 新建一个名为MyselfAppend的Java项目, 同时添加相关jar包
2.2. 在src目录下, 新建logback.xml
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%-4relative [%thread] %-5level - %msg%n</pattern>
</encoder>
</appender>
<appender name="myAppend" class="com.fj.MyselfAppend">
<fileName>log/myAppend.xml</fileName>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%-4relative [%thread] %-5level - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="stdout" />
<appender-ref ref="myAppend" />
</root>
</configuration>
2.3. 新建MyselfAppend.java
package com.fj;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.util.FileUtil;
public class MyselfAppend extends AppenderBase<ILoggingEvent> {
private String fileName;
private PatternLayoutEncoder encoder;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public PatternLayoutEncoder getEncoder() {
return encoder;
}
public void setEncoder(PatternLayoutEncoder encoder) {
this.encoder = encoder;
}
@Override
protected void append(ILoggingEvent event) {
if (this.encoder == null) {
addError("No layout set for the appender named [" + name + "].");
return;
}
if (null == fileName || fileName.length() < 5 || !fileName.endsWith(".xml")) {
addError("Is not xml file, fileName [" + fileName + "].");
return;
}
File file = new File(fileName);
boolean result = FileUtil.createMissingParentDirectories(file);
if (!result) {
addError("Failed to create parent directories for [" + file.getAbsolutePath() + "]");
}
StringBuffer sb = new StringBuffer();
sb.append("<log>").append("\r\n");
sb.append("\t").append("<relative>").append(event.getTimeStamp()).append("</relative>").append("\r\n");
sb.append("\t").append("<thread>").append(event.getThreadName()).append("</thread>").append("\r\n");
sb.append("\t").append("<level>").append(event.getLevel()).append("</level>").append("\r\n");
sb.append("\t").append("<msg>").append(event.getMessage()).append("</msg>").append("\r\n");
sb.append("</log>").append("\r\n");
try {
if(!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file, true);
fw.write(sb.toString());
fw.flush();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.4. 新建MyAppendExample.java
package com.fj;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyAppendExample {
private static final Logger logger = LoggerFactory.getLogger(MyAppendExample.class);
public static void main(String[] args) {
logger.error("继承AppenderBase就可以轻松地写自己的appender。");
logger.warn("AppenderBase处理过滤器、状态信息和大多数appender共享的其他功能。");
logger.info("派生类只需要实现一个append(Object eventObject)方法。");
}
}
2.5. 运行项目, 控制台打印
2.6. 运行项目, myAppend.xml文件输出