博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Log4j自定义Appender
阅读量:5361 次
发布时间:2019-06-15

本文共 4002 字,大约阅读时间需要 13 分钟。

log4j 环境包括三个主要组件:

logger(日志记录器): 控制要启用或者禁用哪些日志记录语句。可以对日志记录器制定如下级别:

  ALL、DEBUG、INFO、WARN、ERROR、FATA、OFF。

layout(布局):根据用户的愿望格式化日志记录请求。

appender:向目的地发送格式化的输出。log4j自带了还记中appender如下:

  1. ConsoleAppender
  2. FileAppender
  3. SMTPAppender
  4. JDBCAppender
  5. JMSAppender
  6. NTEventAppender
  7. SyslogAppender

       也可以创建自定义的Appender

******************************************************华丽的分割丰富********************************************************************************

创建自定义的Appender

1. 继承AppenderSkeleton类,实现三个方法(也可以继承已有的Appender,重写某些方法,实现需要的逻辑)

public class SimpleAppender extends AppenderSkeleton {    //在log4j.xml中配置需要的属性,此处可以注入    private String developer;    /**     * 激活各组件的方法     * Appender初始的时候被调用     */    @Override    public void activateOptions() {        init();        super.activateOptions();    }    /**     * 自定义初始化方法     */    private void init(){        if (this.layout == null) {            LogLog.debug("The layout is not loaded... we set it.");            String pattern = "[%-5p][%d{yyyy/MM/dd HH:mm:ss}][%X{TRACE_ID}][%X{LOGGER_FILTER1}][%X{LOGGER_FILTER2}][%l][%m]%n";            this.setLayout(new org.apache.log4j.PatternLayout(pattern));        }    }    @Override    protected void append(LoggingEvent loggingEvent) {        String str = "======" + developer + " Test========" + this.getLayout().format(loggingEvent);        System.out.println(str);        writeLogAsync(str);    }    /**     * 异步输出log     * @param value     */    private void writeLogAsync(String value){        CompletableFuture.runAsync(() -> {            writeLog(value);        });    }    /**     * @param value     */    private void writeLog(String value) {        //可以记录到数据库、本地、缓存等    }    @Override    public boolean requiresLayout() {        //是否需要布局,如果返回false,即使log4j.xml配置了layout也不生效。        return false;    }    @Override    public void close() {        //释放资源        this.closed = true;    }    public String getDeveloper() {        return developer;    }    public void setDeveloper(String developer) {        this.developer = developer;    }}

 

  继承已有的Appender

public class SimpleFileAppender extends RollingFileAppender {    @Override    protected void subAppend(LoggingEvent event) {        //在此可以做一些过滤,或者格式的调整        qw.write("======SimpleFileAppender Test========" + this.layout.format(event));        if (layout.ignoresThrowable()) {            String[] s = event.getThrowableStrRep();            if (s != null) {                int len = s.length;                for (int i = 0; i < len; i++) {                    this.qw.write(s[i]);                    this.qw.write(Layout.LINE_SEP);                }            }        }        if (this.immediateFlush) {            this.qw.flush();        }        if ((fileName != null) && ((CountingQuietWriter) qw).getCount() >= maxFileSize)            super.rollOver();    }}

 

 2.配置log4j.xml

 

 

3.执行

logger.info("[springDemo]--------info信息");        logger.warn("[springDemo]--------warn提醒");        logger.error("[springDemo]--------error异常");

4.输出结果

 

======lqw Test========[INFO ][2017/09/06 15:29:09][123456][filter1][filter2][com.cn.simple.controller.SimpleController.str(SimpleController.java:82)][[springDemo]--------info信息]======lqw Test========[WARN ][2017/09/06 15:29:09][123456][filter1][filter2][com.cn.simple.controller.SimpleController.str(SimpleController.java:83)][[springDemo]--------warn提醒]======lqw Test========[ERROR][2017/09/06 15:29:09][123456][filter1][filter2][com.cn.simple.controller.SimpleController.str(SimpleController.java:84)][[springDemo]--------error异常]

 

 

 

参考文档:

http://www.360doc.com/content/16/0121/16/14567867_529569233.shtml

log输出到frame参考:

http://zhangjunhd.blog.51cto.com/113473/48895/

 

转载于:https://www.cnblogs.com/Mr-harder/p/7484750.html

你可能感兴趣的文章
Spring常用注解
查看>>
latch release ......
查看>>
String 字符串详解 / 常用API
查看>>
懒加载树[tree]、点击已经加载完成的树[tree]节点,再次加载该节点下一级的所有子节点...
查看>>
[LeetCode]Unique Binary Search Trees
查看>>
CURL
查看>>
让python输出不自行换行的方法
查看>>
用servlet进行用户名和密码校验
查看>>
scala中伴生对象和伴生类
查看>>
格式布局小结
查看>>
plsql 存储过程 测试
查看>>
软件工程实践总结作业——个人作业
查看>>
NiftyNet 项目了解
查看>>
性能优化与使用Block实现数据回传(3)
查看>>
GMIS 2017 大会陈雨强演讲:机器学习模型,宽与深的大战
查看>>
关于图像高速缩放算法,目前看到的最好的最清晰的一篇文章2
查看>>
Aspose.Cells Namespace
查看>>
(四)connection和session的区别
查看>>
React系列:无状态组件生成真实DOM结点
查看>>
软件工程课程总结
查看>>