最初想要在执行一段业务逻辑的时候调用一个外部接口记录审计信息,一直找不到一个比较优雅的方式,经过讨论觉得log4j自定义的appender或许可以实现此功能。后来就了解了一下log4j的这部分。

Apache Log4j 架构 
Apache Log4j是当前在J2EE和J2SE开发中用得最多的日志框架(几乎所有项目都用它),因为它具有出色的性能、灵活的配置以及丰富的功能,并且在业务有特殊的要求时,可以使用自定义组件来代替框架中已有的组件来满足要求。

log4j组件介绍 
Log4j主要有三个组件:

  • Logger:负责供客户端代码调用,执行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
  • Appender:负责日志的输出,Log4j已经实现了多种不同目标的输出方式,可以向文件输出日志、向控制台输出日志、向Socket输出日志等。
  • Layout:负责日志信息的格式化。

Logger 层级介绍 
Logger的层级是logger名字指定的,如x.y 表示两层,x层和y层,x是y的父层级,x.y所在层级是y层级

log4j.additivity.* = false : 表示当前logger不需要打到父层级所指定的appender,只打到当前的appender; 
      默认true:表示当前logger将打印日志到当前的appender及所有的父层级所指定的appender

Layout有多种 
最常用且最灵活的输出格式是: org.apache.log4j.PatternLayout 
可以用以下的各项进行组合配置:

  • %c   logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间。
  • %C  调用logger的类的全名(包含包路径)。
  • %d  日志记录时间,{<日期格式>}使用ISO8601定义的日期格式。
  • %F  调用logger的源文件名。
  • %l    日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
  • %L   调用logger的代码行%m   输出消息。
  • %M   调用logger的方法名。
  • %n   当前平台下的换行符。
  • %p   该条日志的优先级。
  • %r   从程序启动时到记录该条日志时已经经过的毫秒数。
  • %t  产生该日志事件的线程名。
  • %x   按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志。
  • %X   按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。
  • %%   显示一个百分号。)

执行顺序及关系 
调用Log4j输出日志时,调用各个组件的顺序:

  • 1、日志信息传入 Logger。
  • 2、将日志信息封装成 LoggingEvent 对象并传入 Appender。
  • 3、在 Appender 中调用 Filter 对日志信息进行过滤,调用 Layout 对日志信息进行格式化,然后输出。

图示: 

实现自定义log4j Appender 
明白了log4j的结构关系实现自定义的log4j appender就迎刃而解了 
继承log4j公共的基类:AppenderSkeleton 
打印日志核心方法:abstract protected void append(LoggingEvent event); 
初始化加载资源:public void activateOptions(),默认实现为空 
释放资源:public void close() 
是否需要按格式输出文本:public boolean requiresLayout() 
正常情况下我们只需要覆盖append方法即可。然后就可以在log4j中使用了

demo代码:

  1. import org.apache.log4j.AppenderSkeleton;
  2. import org.apache.log4j.spi.LoggingEvent;
  3. public class HelloAppender extends AppenderSkeleton {
  4. private String account ;
  5. @Override
  6. protected void append(LoggingEvent event) {
  7. System.out.println("Hello, " + account + " : "+ event.getMessage());
  8. }
  9. @Override
  10. public void close() {
  11. // TODO Auto-generated method stub
  12. }
  13. @Override
  14. public boolean requiresLayout() {
  15. // TODO Auto-generated method stub
  16. return false;
  17. }
  18. public String getAccount() {
  19. return account;
  20. }
  21. public void setAccount(String account) {
  22. this.account = account;
  23. }
  24. }
  1. public static void main(String[] args) {
  2. Log log = LogFactory.getLog("helloLog") ;
  3. log.info("I am ready.") ;
  4. }
引用
log4j.properties 配置 
log4j.logger.helloLog=INFO, hello

log4j.appender.hello=HelloAppender 
log4j.appender.hello.account=World

执行main函数,输出结果 
Hello, World : I am ready.

Log4j自定义Appender介绍相关推荐

  1. log4j 自定义 appender

    如何使用Log4j? 1. Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧: http://jakarta.ap ...

  2. Log4j自定义Appender

    1.    概述 在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j. Log4j是Apache的一个开放源代码项目, ...

  3. Apache Log4j使用详细介绍

    Apache Log4j使用详细介绍: 一.简介:1, Log4J 是Apache 的Logging项目.可去官网查看. 2,下载地址:http://logging.apache.org/log4j/ ...

  4. appender log4j 扩展_java-如何在log4j2中创建自定义Appender?

    在log4j2中,其工作原理与在log4j-1.2中完全不同. 在log4j2中,您将为此创建一个插件. 该手册在此处提供了自定义附加程序示例的说明:[http://logging.apache.or ...

  5. log4j2自定义appender插件源码、配置及采坑说明

    本篇为扩展appender标签,如果需要扩展filer.marker等其他的log4j2提供的扩展方式,可以查看相关的文档: 中文文档:https://www.docs4dev.com/docs/zh ...

  6. jpa日志 logback_SpringBoot | 第二十五章:日志管理之自定义Appender

    前言 前面两章节我们介绍了一些日志框架的常见配置及使用实践.一般上,在开发过程中,像log4j2.logback日志框架都提供了很多Appender,基本上可以满足大部分的业务需求了.但在一些特殊需求 ...

  7. 【原创】自定义Appender类,输出DCMTK日志

    就像DCMTK官方论坛说的那个问题一样:问题:自定义Appender输出DCMTK的oflog DCMTK日志输出类 大家都知道:DCMTK只提供下面四个日志输出类. FileAppender: Ap ...

  8. 问题:自定义Appender输出DCMTK的oflog

    在我调试DCMTK的DcmNet过程中,发现在Oflog中,DCMTK的日志只能输出到控制台应用程序的console窗口,或者输出到文件中,无法单独获取日志信息. 如果想输出Gui项目中,需要自己继承 ...

  9. logback自定义appender

    1.定义appender 1.1 logback.xml配置 <?xml version="1.0" encoding="UTF-8"?> < ...

最新文章

  1. idea 正则表达式搜索替换
  2. 聊聊接口优化的几个方法
  3. 百度首席科学家吴恩达谈百度人工智能项目进展情况
  4. 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
  5. Hybris CronJob.
  6. 《Swift开发实战》——第1章,第1.4节启动iOS 8模拟器
  7. _不懂操作?手把手教你如何在linux下搭建FTP
  8. 广工大第12届ACM校赛A
  9. [转载] 七龙珠第一部——第050话 海盗的陷阱
  10. 学习SEO排行榜网站的SEO手法优化网站
  11. 计算机物联网工程专业考研,物联网工程专业考研方向
  12. Docker端口映射不起作用的解决办法
  13. enfuzion与lsf构建渲染集群_集群渲染系统构建及优化-精选文档
  14. 蓝桥杯刷题以及算法解析的网址
  15. 新一代iPad mini曝光:屏幕变大、颜值大幅提升!
  16. Additive secret sharing 加性秘密共享(加法,乘法,向量乘法)
  17. 京东程序员回应“被猝死”:程序员该如何保护自己的健康?
  18. java 身边距离怎么查询_附近的人位置距离计算方法
  19. android studio找不到X21,不必苦等Android P,这些“新”功能其实早在vivo X21就已实现...
  20. EasyPlayerPro(Windows)流媒体播放器开发之框架讲解

热门文章

  1. python Flask框架如何请求及返回数据——flask详细教程
  2. Linux拷贝排除一个或多个目录的实现方法
  3. 解决git提示Permission denied (publickey)
  4. oracle11g安装中的问题
  5. 如何设置电脑自动登录系统?不用输入用户名和密码
  6. HDU2018 母牛的故事
  7. 二叉树的前中后序递归和非递归遍历操作【代码】
  8. Android学习笔记之Intent
  9. 有关贝祖定理的一个小问题
  10. javascript 运算+