博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java日志系统研究
阅读量:6166 次
发布时间:2019-06-21

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

hot3.png

基本功能

  1. 支持多个等级的日志打印:trace,debug,warning,error等等
  2. 支持按照不同的包名指定不同的等级
  3. 支持设置全局的默认日志等级
  4. 打印日志到单个或者多个文件,文件可以按指定大小或者按天进行滚动。

高级功能

NDC

NDC(Nested Diagnostic Context,嵌套诊断上下文)是基于栈的思想,信息可以被放到栈上或者从栈中移除。而栈中的值可以被Logger访问,并且Logger无需显式想日志方法中传入任何值。 代码示例:

String username = "admin";String sessionID = "1234";NDC.push(username);NDC.push(sessionID);try {  // tmpFile doesn't exist, causing an exception.  FileReader fr = new FileReader("tmpFile");}catch (Exception ex) {  logger.error("Unable to open file.");}finally {  NDC.pop();  NDC.pop();  NDC.remove();}

Log4j的PatternLayout类通过%x转换字符从NDC中提取值。 代码配套配置:

得到的结果:

admin 1234 ERROR – Unable to open file.

MDC

MDC(Mapped Diagnostic Context,映射调试上下文),是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。 MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。

代码示例:

public class MdcSample {     private static final Logger LOGGER = Logger.getLogger("mdc");     public void log() {         MDC.put("username", "Alex");         if (LOGGER.isInfoEnabled()) {             LOGGER.info("This is a message.");         }     }  }

配套的配置示例:

log4j.appender.stdout.layout.ConversionPattern=%X{username} %d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n

将日志发送到syslog

SyslogAppenders将日志记录发送给本地或者远程系统的日志服务。syslog是一个接收日志事件服务,这些日志事件来自操作系统、进程、其它服务或者其它设备。 Log4j和Logback都内置支持SyslogAppenders。在Log4j中,我们创建SyslogAppender时,需要指定syslog服务监听的主机号、端口号以及协议。下面的示例演示了如何设定装置:

在Logback中,我们可以实现同样的效果:

localhost
514
Auth

动态设置日志等级

  1. 通过spring中的Log4jConfigListener,指定log4jConfigLocation和log4jRefreshInterval,例如:

    log4jConfigLocation
    classpath:log4j.xml
    log4jRefreshInterval
    60000
    org.springframework.web.util.Log4jConfigListener

    这样spring会定时检查配置文件,然后更新日志等级。

    而Logback的参数中自带了一个定时扫描的参数,开箱即用。

  2. 对外暴漏接口,比如web接口。通过调用日志框架的API,运行时改变日志等级。例如:

    org.apache.log4j.Logger#setLevel(level:org.apache.log4j.Level) ch.qos.logback.classic.Logger(level:ch.qos.logback.classic.Level)

    注意改变等级前要先记录下原来的等级,要提供reset功能,回退到原始状态。

  3. 通过JMX调用更改。

各个日志框架之间的关系

纯接口抽象框架:

  1. JCL(Jakarta commons logger),日志接口,自带简单实现。apache社区的项目。
  2. SLF4J(Simple Logging Facade for Java),日志接口。

具有实现的框架:

  1. JUL(java util logger),JDK1.4之后提供的日志api。
  2. log4j,历史悠久,功能强大,使用广泛的一个日志库。不过性能不高,据说现在已经停止维护了。
  3. logback,是由log4j创始人设计的又一个开源日志组件。算是log4j的改良版,并且其实现了SLF4J API,意味着可以支持所有使用SLF4J的程序。
  4. log4j2,看名字就知道是log4j的后续升级版,同归于apache社区。受益于来自LMAX的Disruptor框架,log4j2在性能上有了很大提升,据说比log4j,logback都好。

转换

  1. JCL转换为SLF4J

    commons-logging#commons-logging -> org.slf4j#jcl-over-slf4j
  2. SLF4J转换为JCL

    org.slf4j#slf4j-api -> org.slf4j#slf4j-jcl

适配

  1. JCL适配log4j

    commons-logging#commons-logging -> log4j#log4j
  2. JCL适配logback

    commons-logging#commons-logging -> org.slf4j#jcl-over-slf4j -> ch.qos.logback#logback-classic
  3. JCL适配log4j2

    commons-logging#commons-logging -> org.apache.logging.log4j#log4j-jcl -> org.apache.logging.log4j#log4j-core
  4. SLF4J适配log4j

    org.slf4j#slf4j-api -> org.slf4j#slf4j-log4j12 -> log4j#log4j
  5. SLF4J适配logback

    org.slf4j#slf4j-api -> ch.qos.logback#logback-classic
  6. SLF4J适配log4j2

    org.slf4j#slf4j-api -> org.apache.logging.log4j#log4j-slf4j-impl -> org.apache.logging.log4j#log4j-core

参考资料

转载于:https://my.oschina.net/huanger/blog/714179

你可能感兴趣的文章
关于程序员,你知道的有多少?
查看>>
Tomcat问题汇总
查看>>
由于未预料的错误,现在无法使用nautilus
查看>>
cisco路由器综合实验之四 动态路由协议(rip路由协议)
查看>>
系统安全初探
查看>>
linux服务器编码设置为utf-8,防止ssh乱码
查看>>
质数环问题的两种解法及优化思路
查看>>
[转]DPM2012系列之五:开启最终用户恢复功能
查看>>
Auto Layout on iOS Versions prior to 6.0 解决办法
查看>>
牛人个人网站汇集
查看>>
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(使用位运算)...
查看>>
[转载] Knowledge Management and Engineering——04 生产计划专家系统和国家赔偿法律专家系统...
查看>>
运维工单--服务器申请工单
查看>>
业界最有价值的Linux资料大全(200篇)
查看>>
C++中内存的使用
查看>>
RabbitMQ学习总结(4)——分发任务在多个工作者之间实例教程
查看>>
RabbitMQ学习总结(5)——发布和订阅实例详解
查看>>
mysql5.7 修改root密码
查看>>
软件架构学习小结
查看>>
iOS 键盘理解和拿到更改系统键盘
查看>>