接触过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的一些日志框架。
 
  首先,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,需要做的调整会比较少。

循序渐进看Java web日志跟踪(2)-Java日志API认识的更多相关文章

  1. Java Web项目中缺少Java EE 6 Libraries怎么添加

    Java Web项目中缺少Java EE 6 Libraries怎么添加 具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build P ...

  2. 《Java Web开发实战》——Java工程师必备干货教材

    一年一度毕业季,又到了简历.offer漫天飞,失望与希望并存的时节.在IT行业,高校毕业生求职时,面临的第一道门槛就是技能与经验的考验,但学校往往更注重学生的理论知识,忽略了对学生实践能力的培养,因而 ...

  3. java web 学习 --第六天(Java三级考试)

    第五天学习在这:http://www.cnblogs.com/tobecrazy/p/3458592.html session对象 当某个用户首次访问web应用系统时,jsp会自动创建出一个sessi ...

  4. Java Web项目报错java.lang.NullPointerException at org.apache.jsp.front.index_jsp._jspInit(index_jsp.java:30)

    环境:myeclipse+tomcat6+jdk6 今天搭建了一个Java Web项目,访问index.jsp时报如下错误: 严重: Servlet.service() for servlet jsp ...

  5. 【java web】Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

    javaweb报错如下:22:49:22.155 [http-nio-8081-exec-9] ERROR org.apache.struts2.dispatcher.DefaultDispatche ...

  6. 我的第7个java程序--把java web项目改为java project项目--mybatis

    连接数据库需要 程序,连接字符串,查询语句 主程序->读取连接字符串->读取查询语句->把查询到的值赋值给映射对象->打印对象属性 java project的好处,不用做那么多 ...

  7. Java Web接入支付宝扫码付款API(使用SDK证书配置properties )

    一.支付宝当面付功能Demo 官方文档https://docs.open.alipay.com/194/106078/ ps:因为沙箱环境一经配置了证书公钥则无法重置 第一步下载项目SKD&D ...

  8. Java Web表达式注入

    原文:http://netsecurity.51cto.com/art/201407/444548.htm 0×00 引言 在2014年6月18日@终极修炼师曾发布这样一条微博: 链接的内容是一个名为 ...

  9. Spring MVC + Spring + Mybitis开发Java Web程序基础

    Spring MVC + Spring + Mybitis是除了SSH外的另外一种常见的web框架组合. Java web开发和普通的Java应用程序开发是不太一样的,下面是一个Java web开发在 ...

  10. ref:一种新的攻击方法——Java Web表达式注入

    ref:https://blog.csdn.net/kk_gods/article/details/51840683 一种新的攻击方法——Java Web表达式注入 2016年07月06日 17:01 ...

随机推荐

  1. Idea安装GO语言插件

    https://github.com/go-lang-plugin-org/go-lang-idea-plugin 安装方法写的很清楚,网上也很多我就不细写了,只是有一个问题,下载插件下不下来,懒得找 ...

  2. 【WCF系列二:如何调用WCF服务】WCF入门教程(图文)VS2012

    上一遍到现在已经有一段时间了,先向关注本文的各位“挨踢”同仁们道歉了.小生自认为一个ITer如果想要做的更好,就需要将自己的所学.所用积极分享出来,接收大家的指导和吐槽.网上也有很多WCF相关的教程, ...

  3. twisted学习笔记 No.2 WebServer

    原创博文,转载请注明出处. 当服务器接收到一个客户端请求后,会创建一个请求对象并传递到资源系统,资源系统会根据请求路径分发到相应的资源对象,资源被要求渲染自身并返回结果到客户端. 解析HTTP Req ...

  4. UVA 10392 (13.07.28)

    Problem F: Factoring Large Numbers One of the central ideas behind much cryptography is that factori ...

  5. C# 求精简用一行代码完成的多项判断 重复赋值

    C# 求精简用一行代码完成的多项判断 重复赋值 哈哈,说实话,个人看着这么长的三元操作也麻烦,但是我也只想到了这样三元判断句中执行方法体能够写到一行,追求的终极目的是,用一行实现这个过程,而且简单,由 ...

  6. Bootstrap3.0入门学习系列

    Bootstrap3.0入门学习系列规划[持续更新]   前言 首先在此多谢博友们在前几篇博文当中给与的支持和鼓励,以及在回复中提出的问题.意见和看法. 在此先声明一下,之前在下小菜所有的随笔文章中, ...

  7. [转]Decrypt Any iOS Firmware on Mac, Windows, Linux

    source:http://www.ifans.com/forums/threads/decrypt-any-ios-firmware-on-mac-windows-linux.354206/ Dec ...

  8. .NET核心代码保护策略

    .NET核心代码保护策略-隐藏核心程序集 经过之前那个道德指责风波过后也有一段时间没写博客了,当然不是我心怀内疚才这么久不写,纯粹是程序员的通病..怎一个懒字了得,本来想写一些长篇大论反讽一下那些道德 ...

  9. win7 安装 sql2000

    win7 安装:http://wenku.baidu.com/link?url=xNcfrMaMzX0KgBcjpMaySRaKITM2Op73ZI8sOX49zgl-GWPGB3vqye9gZA_c ...

  10. 服务器如何防ssh服务暴力破解??

     如图: 当我们遭到暴力破解ssh服务该怎么办 内行看门道 外行看热闹  下面教大家几招办法: 1 密码足够的复杂,密码的长度要大于8位最好大于20位.密码的复杂度是密码要尽可能有数字.大小写字母和特 ...