log4j基本原理

把log4j.properties或是log4j.xml放在src根下(ClassPath路径中),这个文件在第一次调用log4j时会在类路径下找到该文件并加载.

1. log4j的意义

在应用程序中添加日志记录总的来说基于三个目的:(1)监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;(2)跟踪代码运行时轨迹,作为日后审计的依据;(3)担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。

最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。

2. log4j的作用

我们可以控制日志信息输送的目的地是控制台、文件等;

我们也可以控制每一条日志的输出格式;

通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

3. log4j的构成

log4j包含三个组件,分别是 Loggers(记录器)、Appenders(输出源)、Layouts(日志布局)。可分别简单理解为"日志类别"、"日志要输出的地方"和"日志以何种形式输出"。

Loggers: Logger组件负责产生日志,能够对日志进行筛选,控制什么样的日志可以被输出,什么样的日志应该被忽略。Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL(都在org.apache.log4j.Level类中定义)。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别Q比P高,则可以启动,否则屏蔽掉。假设你定义的级别是info,那么error和warn的日志可以显示而比他低的debug信息就不显示了。日志级别的作用:当程序编写完成以后当不再需要调式信息时,将日志级别调到最高即可。程序员可以定义多个Logger组件,每个Logger组件都有唯一的名字,logger组件之间通过名字来表明Logger组件之间的隶属关系。最高层次的Logger组件是:org.apache.log4j.Logger类中。使用此类中的静态方法:getRootLogger()来得到它。例子

  1. private Logger logger = null;
  2. public UserDAOImpl() {
  3.    logger = Logger.getLogger(this.getClass().getName());//建立Logger的一个实例
  4.    logger.setLevel(Level.INFO);//设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。
  5.    logger.warn("warnTest");//这个请求可输出Logger信息,因为WARN >= INFO
  6.    logger.info("infoTest");//这个请求可输出Logger信息,因为INFO >= INFO
  7.    logger.debug("debugTest");//这个请求不可输出Logger信息,因为DEBUG < INFO
  8. }

在对Logger实例进行命名时,没有限制,可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例,这是目前来讲比较有效的Logger命名方式(edu.hust.dao.impl.UserDAOImpl.java, 即this.getClass().getName()。这样可以使得每个类建立自己的日志信息,便于管理。

Appenders: 禁用与使用日志请求只是Log4j其中的一个小小的地方,Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。在Log4j中,日志信息通过Appender组件输出到目的地,一个Appender实例就代表了一个目的地。一个记录器(Logger)可以拥有多个Appender。

其语法表示为:

org.apache.log4j.ConsoleAppender --> 控制台org.apache.log4j.FileAppender --> 文件

org.apache.log4j.DailyRollingFileAppender --> 按照指定的日期或时间频率滚动产生日志文件

org.apache.log4j.RollingFileAppender --> 当文件到达一定长度时,备份文件即产生一个新的文件

org.apache.log4j.WriterAppender --> 将日志信息以流格式发送到任意指定的地方

配置时使用方式为:

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

log4j.appender.appenderName.option1 = value1

......

log4j.appender.appenderName.optionN = valueN

Layouts: 有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。Layout组件负责格式化输出日志信息,一个Appender只能有一个Layout组件。

其语法表示为:

org.apache.log4j.HTMLLayout --> 以HTML网页表格的形式输出日志信息(.html)

org.apache.log4j.PatternLayout --> 程序员根据一系列的格式化标签,类似C中的printf()函数的输出

org.apache.log4j.SimpleLayout --> 由日志级别 + “-” + 消息 组成 例如:DEBUG–错误

org.apache.log4j.TTCCLayout --> 由时间(time),线程(thread),类别(category),和嵌套的上下文(context)信息组成。(TTCC有上述四个英文单词组成)(.log)

配置时使用方式为:

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

log4j.appender.appenderName.layout.option1 = value1

......

log4j.appender.appenderName.layout.optionN = valueN

4. log4j的配置

(1)建立Logger实例

语法表示:public static Logger getLogger( String name)

实际使用:static Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ()) ;

(2)读取配置文件

获得了Logger的实例之后,接下来将配置Log4j使用环境:

语法表示:

BasicConfigurator.configure():自动快速地使用缺省Log4j环境。

PropertyConfigurator.configure(String configFilename):读取使用Java的特性文件编写的配置文件。

DOMConfigurator.configure(String filename):读取XML形式的配置文件。

实际使用:

PropertyConfigurator.configure("log4j.properties");

(3)插入日志信息

完成了以上连个步骤以后,下面就可以按日志的不同级别插入到你要记录日志的任何地方了。

语法表示:

Logger.debug(Object message);//调试信息

Logger.info(Object message);//一般信息

Logger.warn(Object message);//警告信息

Logger.error(Object message);//错误信息

Logger.fatal(Object message);//致命错误信息

实际使用:log.debug("delete successful"); log.error("delete failed", e);

5. log4j的配置过程

在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是java properties(key=value)【Java特性文件(键=值)】

下面我们介绍使用Java特性文件做为配置文件的方法

(1)配置根Logger,其语法为:

log4j.rootLogger = [level], appenderName1, appenderName2, …

level: 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。

appenderName: 就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。

例如:log4j.rootLogger=info,A1,B2,C3

(2)配置日志信息输出目的地,其语法为:

log4j.appender.appenderName = fully.qualified.name.of.appender.class //"fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个:

org.apache.log4j.ConsoleAppender(控制台)

org.apache.log4j.FileAppender(文件)

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)

org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

ConsoleAppender选项

Threshold=WARN: 指定日志消息的输出最低层次。

ImmediateFlush=true: 默认值是true,意谓着所有的消息都会被立即输出。

Target=System.err:默认情况下是:System.out,指定输出控制台

FileAppender选项

Threshold=WARN: 指定日志消息的输出最低层次。

ImmediateFlush=true: 默认值是true,意谓着所有的消息都会被立即输出。

File=mylog.txt: 指定消息输出到mylog.txt文件。

Append=false: 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

DailyRollingFileAppender选项

Threshold=WARN: 指定日志消息的输出最低层次。

ImmediateFlush=true: 默认值是true,意谓着所有的消息都会被立即输出。

File=mylog.txt: 指定消息输出到mylog.txt文件。

Append=false: 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

DatePattern='.'yyyy-ww: 每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:

1)'.'yyyy-MM: 每月

2)'.'yyyy-ww: 每周

3)'.'yyyy-MM-dd: 每天

4)'.'yyyy-MM-dd-a: 每天两次

5)'.'yyyy-MM-dd-HH: 每小时

6)'.'yyyy-MM-dd-HH-mm: 每分钟

RollingFileAppender 选项

Threshold=WARN: 指定日志消息的输出最低层次。

ImmediateFlush=true: 默认值是true,意谓着所有的消息都会被立即输出。

File=mylog.txt: 指定消息输出到mylog.txt文件。

Append=false: 默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。

MaxBackupIndex=2: 指定可以产生的滚动文件的最大数。

实际应用: log4j.appender.A1=org.apache.log4j.ConsoleAppender //这里指定了日志输出的第一个位置A1是控制台ConsoleAppender

(3)配置日志信息的格式,其语法为:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class //"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个:

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

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

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

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

HTMLLayout选项

LocationInfo=true: 默认值是false,输出java文件名称和行号

Title=my app file: 默认值是 Log4J Log Messages.

PatternLayout选项

ConversionPattern=%m%n: 指定怎样格式化指定的消息。

实际应用: log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n

这里需要说明的就是日志信息格式中几个符号所代表的含义:

-X号: X信息输出时左对齐;

%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,

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

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

%c: 输出日志信息所属的类目,通常就是所在类的全名

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

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

%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。

%%: 输出一个"%"字符

%F: 输出日志消息产生时所在的文件名称

%L: 输出代码中的行号

%m: 输出代码中指定的消息,产生的日志具体信息

%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行

可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:

1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。

2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。

3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。 
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

阅读更多
文章标签: log4j
个人分类: log4j
想对作者说点什么? 我来说一句

Log4j 基本原理

2010年02月22日 385KB 下载

log4j-1.2.14.jar和配置文件

2010年06月29日 323KB 下载

log4j配置文档log4j配置文档

2010年06月30日 3KB 下载

log4j 学习 笔记

2011年04月02日 352KB 下载

log4j实例,配置

2008年11月04日 326KB 下载

log4j 源代码 log4j 源代码

2009年05月25日 409KB 下载

没有更多推荐了,返回首页

不良信息举报

log4j基本原理

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭