MySQL中可以自定义Appender,这里给出一个自定义的将日志输出到指定的文件的appender:
1、继承AbstractAppender类
FileAppender.class
@Plugin(name = FileAppender.FILE_APPENDER, category = "Core", elementType = Appender.ELEMENT_TYPE, printObject = true)
public class FileAppender extends AbstractAppender {
public static final String FILE_APPENDER = "FileAppender";
private String fileName;
/* 构造函数 */
public FileAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, String fileName) {
super(name, filter, layout, ignoreExceptions);
this.fileName = fileName;
}
@Override
public void append(LogEvent event) {
final byte[] bytes = getLayout().toByteArray(event);
writerFile(bytes);
}
/* 接收配置文件中的参数 */
@PluginFactory
public static FileAppender createAppender(@PluginAttribute("name") String name,
@PluginAttribute("fileName") String fileName,
@PluginElement("Filter") final Filter filter,
@PluginElement("Layout") Layout<? extends Serializable> layout,
@PluginAttribute("ignoreExceptions") boolean ignoreExceptions) {
if (name == null) {
LOGGER.error("no name defined in conf.");
return null;
}
if (layout == null) {
layout = PatternLayout.createDefaultLayout();
}
// 创建文件
if (!createFile(fileName)) {
return null;
}
return new FileAppender(name, filter, layout, ignoreExceptions, fileName);
}
private static boolean createFile(String fileName) {
Path filePath = Paths.get(fileName);
try {
// 每次都重新写文件,不追加
if (Files.exists(filePath)) {
Files.delete(filePath);
}
Files.createFile(filePath);
} catch (IOException e) {
LOGGER.error("create file exception", e);
return false;
}
return true;
}
private void writerFile(byte[] log) {
try {
Files.write(Paths.get(fileName), log, StandardOpenOption.APPEND);
} catch (IOException e) {
LOGGER.error("write file exception", e);
}
}
}
分析说明:
1、append()方法:
即为将要打印的数据输出到指定地方。
2、craeteAppender()方法:
初始化配置
3、编写对应的构造函数
4、在log4j2.xml文件中配置如下:
<!-- 这个就是自定义的Appender -->
<FileAppender name="File" fileName="log.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%-5p] {%F:%L} - %m%n" />
</FileAppender>
<root level="all">
<appender-ref ref="File"/>
</root>
4、当打印的log日志时,在项目的根目录下可以找到log.log文件
注意:
@PluginElement("Filter") final Filter filter,
@PluginElement("Layout") Layout<? extends Serializable> layout,
这里是用@PluginElement注解。