日志组件
日志框架的目标都是将日志从你的应用程序输出到目标地址,这由三个核心组件组成:
- Loggers: 用来捕捉事件并将其发送给合适的Appender
- Appenders: 也被称为Handlers,负责将捕捉到的日志事件记录到目标位置, 并使用Layout进行格式化处理
- Layout: 也被称为Formatters,它决定了数据在日志记录中的展现形式
当logger记录一个事件时,它将事件转发到合适的Appender(Handler),Appender再使用layout对记录格式化并将其发送到控制台、文件、或者其他目标位置。
日志框架
现在常用的日志框架有log4j,logback,slf4j等,这些日志框架大都通过配置文件来设置记录器的级别、存放器、和布局格式,配置文件可以是key=value形式的properites文件,也可以是xml文件形式,如Log4j:
log4j
可以设置级别:debug < info < warn < error
debug: 显示debug, info, warn, error
info: 显示info, warn, error
warn: 显示warn, error
error: 只显示error
日志的输出级别由rootLogger和普通Logger设置的最高级别决定。
log4j.rootLogger=debug,appender1, appender2,...
log4j.rootLogger=info,appender1, appender2,...
log4j.rootLogger=warn,appender1
log4j.rootLogger=error,appender1
其中log4j提供了几种appender:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
log4j提供的Layout
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
这里配置的是类所在的包test.log4j, 逗号之前未配置日志输出级别,默认为根logger的级别(日志的输出级别由rootLogger和普通Logger设置的最高级别决定),test.log4j包下对应的log使用Test appender
log4j.logger.test.log4j=, TEST
log4j.appender.TEST=org.apache.log4j.ConsoleAppender
log4j.appender.TEST.layout=org.apache.log4j.TTCCLayout
slf4j
slf4j 本身并不是具体的日志解决方案,它是服务于日志系统的Fascade,允许用户在部署其应用时使用其所希望的日志系统,为复杂的日志系统提供了简单一致的接口。slf4j提供的核心API是一些接口以及LoggerFactory工厂类,直接调用这些api即可,不需要在代码或者配置文件中指定你打算使用的具体日志系统。可以灵活的切换具体的日志系统。最终日志的格式、记录级别等是通过具体日志系统的配置实现。
slf4j举例
package test.slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloSlf4j {
private static final Logger logger = LoggerFactory.getLogger(HelloSlf4j.class);
public static void main(String[] args) {
logger.debug("This is debug message");
logger.info("This is info message");
logger.warn("This is warn message");
logger.error("This is error message");
}
}
如果使用log4j作为底层日志工具,运行以上程序需要三个包log4j-1.2.xx.jar、slf4j-api-x.x.x.jar、以及slf4j-log4j12-x.x.x.ja,后面两个包由slf4j提供。当你需要换一职中logging的实现时,只需要简单替换几个jar包即可,无须修改散步在代码各处的logging接口调用。
slf4j优势
- 不再需要冗长的级别判断,在log4j中,为了提高运行效率,往往在输出信息之前,还要进行级别判断,并在输出字符串时常常需要拼接字符串
if (logger.isDebugEnabled()){
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
}
而在slf4j,就不需要字符串连接,而是使用占位符,在生产最终日志信息的字符串之前,这个方法会检查一个特定的日志级别是不是打开了,这降低了构建日志信息(String)的开销,内存消耗而且预先降低了CPU去处理字符串连接命令的时间。
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
debug的实现:
if (logger.isDebugEnabled()) {
FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
}
}
网友评论