天天看点

log4j&slf4j日志框架入门

Log4j是什么、有什么

Log4j是Apache的一个开放源代码项目,通过使用Log4j,可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器等;也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

一个开源的、轻量级的、用于日志管理的框架

 Log4j由三个重要的组件构成: 日志信息的输出格式,日志信息的优先级, 日 志信息的输出目的地。日志信息的优先级用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容 。

主要用来进行日志记录的管理,包括对日志输出的目的地,输出的信息级别和输出的格式等。

Logger被指定为实体,Logger的名字是大小写敏感的,它们遵循以下的命名语法规则:用“.”来划分层次级别,如:cn.javass.test

OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,可以控制到应用程序中相应级别的日志信息的开关。

1:级别的控制,就是只要大于等于指定的控制级别,就可以输出

2:如果有多个logger,都可以匹配输出,则每个logger都产生输出,其中根logger匹配所有的输出;而级别控制来源于路径最详细的logger。

java代码:

Log4j允许日志请求被输出到多个输出源。用Log4j的话说,一个输出源被称做一个Appender 。

一个logger可以设置超过一个的appender。

布局就是指输出信息的格式。在Log4j中称作Layout

org.apache.log4j.HTMLLayout(以HTML表格形式布局), 

org.apache.log4j.PatternLayout(可以灵活地指定布局模式), 

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), 

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

%m 输出代码中指定的消息 

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 

%r 输出自应用启动到输出该log信息耗费的毫秒数 

%c 输出所属的类目,通常就是所在类的全名 

%t 输出产生该日志事件的线程名 

%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” 

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

Log4j有两种配置方式,一种是xml格式,一种是properties格式。都是放置到classpath下面。默认名称分别是:log4j.xml和log4j.properties

每个Appender都要引用自己的Layout。

每个Logger都可以指定一个级别,同时引用多个Appender;而一个Appender也同时可以被多个Logger引用。

首先要注意,log4j.xml优先于log4j.properties,如果同时存在log4j.xml和log4j.properites,以log4j.xml为准。

在log4j.properties里,控制级别的时候,只能打印出大于指定级别的所有信息;但是在log4j.xml中可以通过filter来完成过滤:典型的引用是只打印出某种级别的信息。

可以通过logger的additivity=“false”属性,来设置多个logger是否重复输出同一条信息

为什么不是直接logger.debug(“debug:“+name);呢?

在配置文件中虽然可以使用控制级别为比debug级别更高的级别,而不输出debug信息;但是,这里的字符串连接操作仍然会影响运行效率;如果先判断当前logger的级别,如果级别不合适的话,连这句字符串连接都可以不做了。

在java中使用log4j时,我们可以使用它的eclipse插件log4e。它的官方网址是:http://log4e.jayefem.de/,分为商业版本和免费版本。我们只需要使用其免费版本,就可以极大的帮我们提高开发效率。比如:在一个类中声明一个logger;帮我们写麻烦的logger.isDebugEnabled();在一个方法开始的时候打印所有的参数;输出一个变量等等。

除了使用log4j进行日志输出之外,我们还可以使用jdk内置的日志系统。它位于java.util.logging包下,因此不需要引用额外的jar包。其基本概念与log4j大同小异,我们可以类比的学习。

其配置文件位于jdk安装目录下的/jre/lib/logging.properties。

请同学们观察配置文件,自己找到我们在log4j里找的Appender、Layout、级别和Logger,以及它们的关系。

简单日记门面(simple logging Facade for java)SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。

准确的说,slf4j并不是一种具体的日志系统,而是一个用户日志系统的facade,允许用户在部署最终应用时方便的变更其日志系统。

在系统开发中,统一按照slf4j的API进行开发,在部署时,选择不同的日志系统包,即可自动转换到不同的日志系统上。比如:选择JDK自带的日志系统,则只需要将slf4j-api-1.5.10.jar和slf4j-jdk14-1.5.10.jar放置到classpath中即可,如果中途无法忍受JDK自带的日志系统了,想换成log4j的日志系统,仅需要用slf4j-log4j12-1.5.10.jar替换slf4j-jdk14-1.5.10.jar即可( 当然也需要log4j的jar及 配置文件)

log4j&slf4j日志框架入门

大家应该还记得,在log4j中,为了提高运行效率,往往在输出信息之前,还要进行级别判断,以避免无效的字符串连接操作。如下:

if (logger.isDebugEnabled()){

logger.debug(“debug:“+name);

}

slf4j巧妙的解决了这个问题:先传入带有占位符的字符串,同时把其他参数传入,在slf4j的内容部实现中,如果级别合适再去用传入的参数去替换字符串中的占位符,否则不用执行。

logger.info("{} is {}", new String[]{“x",“y"});

转载地址:http://sishuok.com/forum/blogPost/list/0/3740.html#8838

      本文转自027ryan  51CTO博客,原文链接:http://blog.51cto.com/ucode/1790136,如需转载请自行联系原作者