java日志小结

2018-08-29  本文已影响9人  tracy_668

日志组件

日志框架的目标都是将日志从你的应用程序输出到目标地址,这由三个核心组件组成:

日志框架

现在常用的日志框架有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优势
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());
    }
}
上一篇 下一篇

猜你喜欢

热点阅读