自定义log4j Appender

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注解。

发布了164 篇原创文章 · 获赞 113 · 访问量 68万+

猜你喜欢

转载自blog.csdn.net/timchen525/article/details/82874270
今日推荐