NDC(Nested Diagnostic Context,嵌套诊断上下文)是基于栈的思想,信息能够被放到栈上或者从栈中移除。而栈中的值能够被Logger访问,而且Logger无需显式想日志方法中传入任何值。 代码示例:html
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中提取值。 代码配套配置:java
<PatternLayout pattern="%x %-5p - %m%n" />
获得的结果:git
admin 1234 ERROR – Unable to open file.
MDC(Mapped Diagnostic Context,映射调试上下文),是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。 MDC 能够当作是一个与当前线程绑定的哈希表,能够往其中添加键值对。MDC 中包含的内容能够被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当须要记录日志时,只须要从 MDC 中获取所需的信息便可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来讲,一般是在请求被处理的最开始保存这些数据。web
代码示例:spring
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."); } } }
配套的配置示例:apache
log4j.appender.stdout.layout.ConversionPattern=%X{username} %d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n
SyslogAppenders将日志记录发送给本地或者远程系统的日志服务。syslog是一个接收日志事件服务,这些日志事件来自操做系统、进程、其它服务或者其它设备。 Log4j和Logback都内置支持SyslogAppenders。在Log4j中,咱们建立SyslogAppender时,须要指定syslog服务监听的主机号、端口号以及协议。下面的示例演示了如何设定装置:api
<Appenders> <Syslog name="SyslogAppender" host="localhost" port="514" protocol="UDP" facility="Auth" /> </Appenders>
在Logback中,咱们能够实现一样的效果:session
<appender name="SyslogAppender" class="ch.qos.Logback.classic.net.SyslogAppender"> <syslogHost>localhost</syslogHost> <port>514</port> <facility>Auth</facility> </appender>
经过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会定时检查配置文件,而后更新日志等级。app
而Logback的参数中自带了一个定时扫描的参数,开箱即用。
对外暴漏接口,好比web接口。经过调用日志框架的API,运行时改变日志等级。例如:
org.apache.log4j.Logger#setLevel(level:org.apache.log4j.Level) ch.qos.logback.classic.Logger(level:ch.qos.logback.classic.Level)
注意改变等级前要先记录下原来的等级,要提供reset功能,回退到原始状态。
经过JMX调用更改。
纯接口抽象框架:
具备实现的框架:
转换
JCL转换为SLF4J
commons-logging#commons-logging -> org.slf4j#jcl-over-slf4j
SLF4J转换为JCL
org.slf4j#slf4j-api -> org.slf4j#slf4j-jcl
适配
JCL适配log4j
commons-logging#commons-logging -> log4j#log4j
JCL适配logback
commons-logging#commons-logging -> org.slf4j#jcl-over-slf4j -> ch.qos.logback#logback-classic
JCL适配log4j2
commons-logging#commons-logging -> org.apache.logging.log4j#log4j-jcl -> org.apache.logging.log4j#log4j-core
SLF4J适配log4j
org.slf4j#slf4j-api -> org.slf4j#slf4j-log4j12 -> log4j#log4j
SLF4J适配logback
org.slf4j#slf4j-api -> ch.qos.logback#logback-classic
SLF4J适配log4j2
org.slf4j#slf4j-api -> org.apache.logging.log4j#log4j-slf4j-impl -> org.apache.logging.log4j#log4j-core