log4j使用整理材料(1)

Log4j详解
本文介绍Log4j的基本原理及其在项目中的应用。Log4j是一个开源的日志记录工具,能够帮助开发者灵活控制日志输出级别及格式。文章详细阐述了Log4j的三大核心组件:Logger、Appender和Layout的功能及配置方法。

一、前言

在我们的日常开发中,经常需要通过输出一些信息进行程序的调试,如果到处都用system.out.println()则在项目发布之后要逐一删除,而log4j提供了一种新的调试输出机制以解决输出的问题。log4j的原理是使用一个配置文件log4j.properties进行管理,在调试的时候可以把输出级别调低,项目正式发布之后把级别调高,这样以前的一些输出就可以屏蔽了,不用到程序当中再进行逐一删除。

log4j是一个开放源码项目,是广泛使用的以Java编写的日志记录包。由于log4j出色的表现,当时在log4j完成时,log4j开发组织曾建议sunjdk1.4中用log4j取代jdk1.4 的日志工具类,但当时jdk1.4已接近完成,所以sun拒绝使用log4j,当在java开发中实际使用最多的还是log4j,人们遗忘了sun的日志工具类。它的一个独有特性包括在类别中继承的概念。通过使用类别层次结构,这样就减少了日志记录输出量,并将日志记录的开销降到最低。

log4j允许开发者控制以任意间隔输出哪些日志语句。通过使用外部配置文件,完全可以在运行时进行配置。几乎每个大的应用程序都包括其自己的日志记录或跟踪 API。经验表明日志记录是开发周期中的重要组成部分。同样,日志记录提供一些优点。首先,它可以提供运行应用程序的确切 上下文。一旦插入到代码中,生成日志记录输出就不需要人为干涉。其次,日志输出可以保存到永久媒体中以便以后研究。最后,除了在开发阶段中使用,十分丰富的日志记录包还可以用作审计工具。

二、log4j的組成

    Log4主要有3部分组成: loggers, appenders layouts。这三种组件相互协调来保证开发人员可以根据日志信息的级别有选择地记录日志,而且使开发人员可以在不修改程序的情况下改变日志的记录格式和输出位置。logger是具体执行logging命令的对象, 可以指定等级(Level), 如果没有指定logger的等级,它会继承最近上一层logger的等级设置。appenderlog输出的目的地, 比如ConsoleAppenderlog输出到System.out或者System.err, FileAppenderlog输出到一个文件。layout指定输出的格式。

1、 loggers(日志器)  

配置根Logger,其语法为:                              

log4j.rootLogger = [ level ] , appenderName, appenderName, ...

1.1.1    级别(level                                                                代表日志的记录的级别。Loggers组件在此系统中被分为五个级别:DEBUGINFOWARNERRORFATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别QP高,则可以启动,否则屏蔽掉。 

1.1.2    级别的继承(Level Inheritance

每个日志器都必须有一个级别,如果没有为日志器指定级别,它就会从上级日志器那里继承一个级别。为了保证所有的日志器都有级别,根日志器必须有一个级别,缺省是输出所有日志。

1.1.3    输出目的地(appenderName

指定日志输出的目的地,可以是多个目的地。包括控制台、文件、数据库等。

例如:log4j. rootLogger =INFO,stdout,Runlog,Errorlog

根据日志类别为INFODEBUG将被屏蔽,其他的将被输出。 stdout,Runlog,Errorlog分别为3个输出目的地。

1.1.4    在源码中使用方法

在要输出的日志中添加如下的代码:

private final static Logger log=Logger.getLogger(className.class);

源码的例子:

import org.apache.log4j.Logger;

public class Log4jtest {

         private final static Logger

log = Logger.getLogger(Log4jtest.class);

   public static void main(String[] args) {

       log.info("日志输出信息测试");

   }

}

2、 appenders(追加器)  

指定输出目的地,语法为:

log4j.appender.appenderName = fully.qualified.name.of.appender.class

1.1.5           appenderName 

输出的文件名字,它的名字是随便起的,为了编码的方便,要求它的名字最好和输出目的地有相近的例子。

1.1.6           fully.qualified.name.of.appender.class     

该项是要求输出的目的地类型, Log4J配置文件实现了输出到控制台、文件、 回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能类型:

log4j支持的输出目的地:

# 输出控制台的类型

org.apache.log4j.ConsoleAppender

# 输出文件的类型

org.apache.log4j.FileAppender

# 按天产生日志文件

org.apache.log4j.DailyRollingFileAppender

# 按大小产生文件

org.apache.log4j.RollingFileAppender

# 将日志信息以流格式发送到任意指定的地方

org.apache.log4j.WriterAppender

# 输出到邮件

org.apache.log4j.net.SMTPAppender 邮件

# 输出到数据库

org.apache.log4j.jdbc.JDBCAppender 数据库

3、 layout(布局)  

开发人员不但需要定义输出的目的地,还需要定义输出的格式。这通过给每个追加器定义一个布局来实现,布局负责将日志信息按用户的要求格式化,而追加器负责将格式化了的日志信息输出到目的地。对于每个起名了的追加器,我们都可以为它配置一个布局,配置追加器语法如下:

log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class

log4j.appender.appenderName.layout.option1=value1

....

log4j.appender.appenderName.layout.optionN=valueN

1.1.7           布局的定义类型   

Log4j提供了以下几种布局

# html表格形式布局

org.apache.log4j.HTMLLayout

# 可以灵活的指定布局模式

org.apache.log4j.PatterLayout

# 包含日志消息的级别和信息字符串

org.apache.log4j.SimpleLayout

# 包含日志产生的时间线程和类别

org.apache.log4j.TTCCLayout

1.1.8           布局输出方式

标准的log4j发布包中有一个PatternLayout包,它可以让用户用与C语言中printf方法相似的模式来指定输出格式。

具体如下:

 %p 输出优先级,即DEBUGINFOWARNERRORFATAL
 %r 输出自应用启动到输出该log信息耗费的毫秒数
 %c 输出所属的类目,通常就是所在类的全名
 %t 输出产生该日志事件的线程名
 %n 输出一个回车换行符,Windows平台为“\r\n”Unix平台为“\n”
 %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20021018 221028921
 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

详细的解释:

1c

输出日志器的名称,日志器的名称可能为X.Y.Z格式,所以在该格式的后面可以跟一个用大括号括起来的10进制数字,这个数字显示的日志器名称的精度。
在缺省条件下,该格式输出日志器的全名,一旦加上了精度,那么就从全名的右边输出N个部分。

例如:对于名为“a.b.c”的日志器,使用%c{2}将输出“b.c”。

2C

输出调用日志器的类的全名,与c相似,该格式也可以跟一个精度描述符。
例如:名为“org.apache.xyz.SomeClass”的类使用了日志器去记录日志,在日志的显示格式中使用%C{1}将输出“SomeClass”。

警告:生成调用类的信息是一项比较慢的工作。因此,最好在不关心运行速度的时候使用此格式。

3d

用于输出记录日志的时间,日期转换描述符可以跟一个时间格式的描述符,格式描述符放在一个大括号中,例如%d{HH:mm:ss,SSS}%d{dd MMM yyyy HH:mm:ss, SSS},如果没有指定日期格式,缺省将使用ISO8601格式。

格式描述符和SimpleDateFormat类中的时间格式字符串的语法相同:

Symbol   Meaning                 Presentation        Example

 ------   -------                 ------------        -------

 G        era designator          (Text)              AD

 y        year                    (Number)            1996

 M        month in year           (Text & Number)     July & 07

 d        day in month            (Number)            10

 h        hour in am/pm (1~12)    (Number)            12

 H        hour in day (0~23)      (Number)            0

 m        minute in hour          (Number)            30

 s        second in minute        (Number)            55

 S        millisecond             (Number)            978

 E        day in week             (Text)              Tuesday

 D        day in year             (Number)            189

 F        day of week in month    (Number)            2 (2nd Wed in July)

 w        week in year            (Number)            27

 W        week in month           (Number)            2

 a        am/pm marker            (Text)              PM

 k        hour in day (1~24)      (Number)            24

 K        hour in am/pm (0~11)    (Number)            0

 z        time zone               (Text)              Pacific Standard Time

 '        escape for text         (Delimiter)

 ''       single quote            (Literal)           '

使用与SimpleDateFormat相同的语法进行日期格式化在某些JDK上可能执行效率较低,所以一般推荐使用log4j自已的日期格式器(formatter),log4j提供三种日期格式器:AbsoluteTimeDateFormatDateTimeDateFormatISO8601DateFormat,可以分别通过它们对应的字符串“ABSOLUTE”、“DATE”、“ISO8601”来使用。例如,%d{ISO8601}%d{ABSOLUTE}

ABSOLUTE的格式:"HH:mm:ss,SSS",如 "15:49:37,459"

DATE的格式:"dd MMM YYYY HH:mm:ss,SSS" ,如"06 Nov 1994 15:49:37,459"

IOS8061的格式:"YYYY-mm-dd HH:mm:ss,SSS",如"1999-11-27 15:49:37,459"

使用这些给定的日志格式器要比使用SimpleDateFormat速度快。

编者:可能是log4j采取了特殊的取时间方法。

4F

输出记录日志操作所在的.java文件的文件名。

警告:生成调用类的信息是一项比较慢的工作。因此,最好在不关心运行速度的时候使用此格式。

5l

在写日志时将类中具体调用了写日志操作的位置输出到日志中。

所输出的位置信息依赖于JVM的实现,但是通常都由调用写日志操作的方法的方法名、该方法所在文件名以及行号组成。

警告:生成定位信息非常有用,但是生成的过程非常非常(extremely)慢,所以最好在不关心速度的情况下使用此格式。

6L

输出写日志操作所在的行号。

警告:生成调用者的位置信息极(extremely)慢,所以最好在不关心速度的情况下使用此格式。

7m

输出应用程序提供的信息,也就是我们输入的日志正文。

8M

输出写日志请求所在的方法的方法名。

警告:生成调用者的位置信息极(extremely)慢,所以最好在不关心速度的情况下使用此格式。

9n

根据平台输出换行符。

我们也可以直接根据平台使用”\n””\r\n”,但是这个格式转换符提供了和上述二种转换符相同的性能,所以它是执行换行的首选操作。

10p

用于输出日志信息的优先级信息。

11r

输出程序启动到写日志时经过的毫秒数。

12t

输出执行写日志操作的线程的名字。

13x

输出与写日志的线程相关的NDCnested diagnostic context)信息。

备注:具体功能研究中。

14%

用二个%%输出一个%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值