循序渐进看Java web日志跟踪(2)-Java日志API认识

时间:2024-01-18 15:54:56
  接触过Java的朋友应该都会知道,java的开源框架百花齐放,实现同样的功能,总能找到几个强大的开源框架来进行选择。在日志方面,Java同样不逊色。除了JDK本身自带的简单的日志工具,java还有如log4j,commons-loggin,slf4j,logback等众多第三方工具框架可供开发者使用,其中,上述几个框架,虽说都实现了日志记录的功能,但相互之间各分伯仲,同时,也存在着一定的联系。比如,log4j,slf4j,logback就是出自同一个人之手。
  在了解各个框架之前,首先过过大部分日志框架的使用时会遇到的一些概念。
1、日志工具类(logger):通常,大部分的日志框架都会定义一个主要的日志输出的工具类,开发者只需要声明该类,即可实现大部分的日志输出操作
2、日志输出级别(Level):日志输出的级别,意味着该日志的重要程度,大部分的日志框架的级别会分为:Debug(调试模式),Info,warn,error,fatal,其中,根据级别的大小排序,debug>info>warn>error>fatal。级别的大小,将会影响日志的输出,将级别设置的越高,输出的信息将会越多
3、日志输出格式(format):日志输出的格式,通常可以进行自定义,通过自定义的格式,输出的详细效果将不同
4、日志输出的方式:即将日志输出到哪?常见的输出方式包括如:控制台,文本文件,数据库等
5、日志分割:日志文件若以文件的方式进行输出的话,会存在文件大小问题,所以需要对日志进行分割,分割的方式可以分为按大小,按日期等。
循序渐进看Java web日志跟踪(2)-Java日志API认识
  如图,常见的日志框架的工作流程大约都会围绕着几个对象展开。首先,通过日志工厂产生一个日志工具类,通过该类来进行日志的输出和日志输出级别的设置,该类的输出,其实是通过另外的框架中定义的不同类型输出类进行输出,常见的包括文件输出,数据库输出,都有与之相对应的日志输出类。同时,该类接收来自配置文件或者开发者自定义的日志输出格式,会根据该日志格式进行日志的输出。
  了解过大部分日志框架的工作方式,接下来了解一下,java的一些日志框架。
  首先,java日志框架嫡长子,jdk自带的log工具,该工具自JDK1.4版本开始就包含在java.util.logging包下。该工具由于太过粗糙,所以并没有得到广泛的使用,但是log框架应有的日志处理功能还是能够实现的:
以下是通过JDK自带的日志工具实现输出的实例代码:
 public class SimpleLog {

     public static void main(String[] args) throws SecurityException, IOException {
Logger log=Logger.getLogger("Test");
//添加log处理,默认是console
ConsoleHandler console=new ConsoleHandler();
console.setLevel(Level.ALL);
log.addHandler(console);
FileHandler file=new FileHandler("log.log");
file.setLevel(Level.WARNING);
log.addHandler(file);
//设置日志输出格式
file.setFormatter(new Formatter() { @Override
public String format(LogRecord record) {
// TODO Auto-generated method stub
return new SimpleDateFormat("yyyy-MM-dd hh-mm-ss").format(new Date(record.getMillis())) +"------"+record.getLevel()+"-------"+record.getClass()+"-------"+record.getLoggerName()+"----"+record.getMessage()+"\t\n";
}
});
console.setFormatter(new Formatter() { @Override
public String format(LogRecord record) {
return new SimpleDateFormat("yyyy-MM-dd hh-mm-ss").format(new Date(record.getMillis())) +"------"+record.getLevel()+"-------"+record.getClass()+"---"+record.getSourceMethodName()+"-------"+record.getLoggerName()+"----"+record.getMessage()+"\t\n";
}
});
//日志控制
log.log(Level.SEVERE, "测试日志");
log.log(Level.INFO, "测试日志");
log.log(Level.WARNING, "测试日志");
log.log(Level.OFF, "测试日志"); }
  接下来,看一下常见的日志框架,common-loggin,log4j,slf4j,logback。其实,个人认为,真正其中真正算是日志框架的只有log4j和logback而已。因为common-logging和slf4j都是进行日志框架整合的工具,本身并没有独特的日志处理功能。commons-logging其实是一个日志集合api,它通过检测classpath环境下存在怎么样的log工具,然后通过调用该工具来进行日志输出操作 。默认情况下,common-logging是通过jdk自带的log工具来实现日志输出的,当检测到项目中存在log4j此类的日志框架及其配置文件的时候,common-logging就会去调用该框架来进行日志的输出。
  接着,看下log4j,一个强大的日志框架。它支持文件俺输出,复杂的自定义格式输出,支持输出成html,数据库等,一系列的强大功能让它成为了许多开源框架首选的日志工具。具体的关于log4j的配置,后续继续更新。
  再说说slf4j,其实它和common-logging有相似的功能,只不过,它并不是通过自己实现日志的整合,而是通过定义接口的,定义标准的方式进行的。Common-logging是通过自身来实现日志框架的调用,而slf4j并不同,它自身其实并没有实现功能,它定义了接口,使用它进行日志输出,通常需要导入slf4j的标准包,日志框架的包,还有就是继承了slf4j定义的接口的操作对应日志框架的实现类包。表面上,我们是在使用slf4j进行日志输出,其实,我们使用的是对应的实现类包中的方法进行日志输出。
  最后一个说到的日志框架,是logback,他和slf4j,log4j是同一个作者。后期,log4j停止了更新后,他又开源了一个新的日志框架就是logback,目前,国外的许多框架也已经开始使用logback了。因为是同出一人,所以logback的一些api其实与log4j有些相似之处,同时,logback也符合slf4j定义的标准,所以如果在项目中使用了slf4j和log4j,后期要改成logback,需要做的调整会比较少。