Java日志系统研究

摘要
java常用日志系统功能总结

基本功能

  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中提取值。 代码配套配置:

<PatternLayout pattern="%x %-5p - %m%n" /> 

得到的结果:

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服务监听的主机号、端口号以及协议。下面的示例演示了如何设定装置:

<Appenders> <Syslog name="SyslogAppender" host="localhost" port="514" protocol="UDP" facility="Auth" /> </Appenders> 

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

<appender name="SyslogAppender" class="ch.qos.Logback.classic.net.SyslogAppender"> <syslogHost>localhost</syslogHost> <port>514</port> <facility>Auth</facility> </appender> 

动态设置日志等级

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

     <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.xml</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> 

    这样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调用更改。

X
赞助一下:
    支付宝    微信    QQ红包

打开支付宝扫一扫
Java日志系统研究
版权声明:若无特殊注明,本文皆为“懒人的小窝”原创,转载请保留文章出处。
本文链接:http://suppore.cn/108.html    百度已收录
正文到此结束

点击下方支持本站

点击支持下贵站吧
点击支持下贵站吧

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

微笑可爱憨笑鼓掌白眼发呆撇嘴色得意吐抠鼻可怜呲牙惊讶冷汗流泪大哭发怒抚摸傲慢惊恐鄙视疑问奸笑抓狂偷笑流汗擦汗晕委屈吓衰糗大了威武给力牛逼

评论信息框

火箭正在发射中...


既然没有吐槽,那就赶紧抢沙发吧!