Java日志组件 commons-logging和log4j介绍

时间:2022-04-29 00:49:26

一、日志系统介绍

日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息是寸步难行的。所以在系统加入日志是必须的。

最原始的日志方式,就是在程序的适当地方添加System.out.println()方法,但是带来的问题是,系统稳定后,日志太大,如果要减少日志量,就需要重新修改程序,虽然只是注释掉System.out.println()方法。但是万一系统再次出错,又要改。

commons-logging提供分级日志功能,相当于把System.out.println()方法加强了,原来是一定输出到控制台,现在commons-logging有6级日志,但是apache建议使用4级,即ERROR、WARN、INFO、 DEBUG。什么情况下输出日志由程序中写日志的方法决定,输出什么级别以上的日志和输出到哪里由配置文件决定。

使用commons-logging如下:

01 //导入类
02 import org.apache.commons.logging.Log;
03 import org.apache.commons.logging.LogFactory;
04 public class TestLog
05 {
06     //获取以当前类为参数的日志对象
07     private static Log log = LogFactory.getLog(TestLog.class);
08     public static void main(String[] args){
09         //输出4种不同级别的日志
10         log.debug("111");
11         log.info("222");
12         log.warn("333");
13         log.error("444");
14     }
15 }

当然还要配置commons-logging.properties文件,其中定义输出哪个级别以上的日志。略。

好像这就完了,和log4j没啥关系。那么为什么一般系统都会使用commons-logging和log4j两个包来记录日志呢?

原因就是commons-logging的输出功能比较弱,也就是输出格式和输出设备选择有限,只有原生输出类 org.apache.commons. logging.impl.SimpleLog。但是它提供了一个通用的日志接口org.apache.commons.logging.log,让其他的包来实现复杂的输出。其中就有Jdk14Logger, Log4JLogger,前面是jdk1.4之后加入的,后面就是log4j中的类。

log4j也可以直接像commons-logging一样在程序中定义输出信息,然后再配置文件中定义输出级别,但是这样做就会使程序唯一的和log4j绑定(如果你一定要单独使用log4j,那么也是可以的),而且commons-logging更加智能,帮我们‘自动选择’‘适当的’日志实现系统”:

1)        首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;

2)        如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;

3)        否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;

4)        否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);

5)        否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;

(以上顺序不保证完全准确,请参考官方文档)

所以,在前面程序的基础上,只要导入log4j的包,则commons-logging会自动使用log4j作为输出类,程序不需要任何改动,但是注意:log4j的配置文件log4j.properties对Log4j来说是必须的。如果classpath中没有该配置文件,或者配置不对,将会引发运行时异常。所以下面介绍log4j.properties的配置。

二、log4j.properties的配置
其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。 
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties格式的文件。下面我们介绍使用properties格式做为配置文件的方法: 
示例:
log4j.rootLogger=INFO, A1 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n 

1. 配置根Logger,其语法为: 
log4j.rootLogger = [ level ] , appenderName, appenderName, … 
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 appenderName是自定义的,但是为了明了,都会使用console,file等特殊名字表示输出到哪里去。

2. 配置日志信息输出目的地Appender,其语法为: 
log4j.appender.appenderName = fully.qualified.name.of.appender.class 
log4j.appender.appenderName.option1 = value1 
… 
log4j.appender.appenderName.option = valueN 
其中,Log4j提供的appender有以下几种: 
org.apache.log4j.ConsoleAppender(控制台), 
org.apache.log4j.FileAppender(文件), 
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), 
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), 
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 
(1).ConsoleAppender选项 
Threshold=WARN:指定日志消息的输出最低层次。 
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 
Target=System.err:默认情况下是:System.out,指定输出控制台 
(2).FileAppender 选项 
Threshold=WARN:指定日志消息的输出最低层次。 
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 
File=mylog.txt:指定消息输出到mylog.txt文件。 
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。 
(3).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: 每分钟 
(4).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:指定可以产生的滚动文件的最大数。 

3. 配置日志信息的布局,其语法为: 
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
log4j.appender.appenderName.layout.option1 = value1 
… 
log4j.appender.appenderName.layout.option = valueN 
其中,Log4j提供的layout有以下几种: 
org.apache.log4j.HTMLLayout(以HTML表格形式布局), 
org.apache.log4j.PatternLayout(可以灵活地指定布局模式), 
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), 
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 

4、输出格式设置 
在配置文件中可以通过log4j.appender.A1.layout.ConversionPattern设置日志输出格式。 
参数: 
%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.properties的几个例子

01 log4j.rootLogger=DEBUG,CONSOLE,A1,im
02 log4j.addivity.org.apache=true
03 #
应用于控制台
04 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
05 log4j.appender.Threshold=DEBUG
06 log4j.appender.CONSOLE.Target=System.out
07 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
08 log4j.appender.CONSOLE.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
09 #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]
n%c[CATEGORY]%n%m[MESSAGE]%n%n
10 #应用于文件
11 log4j.appender.FILE=org.apache.log4j.FileAppender
12 log4j.appender.FILE.File=file.log
13 log4j.appender.FILE.Append=false
14 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
15 log4j.appender.FILE.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
16 #
Use this layout for LogFactor 5 analysis
17 #
应用于文件回滚
18 log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
19 log4j.appender.ROLLING_FILE.Threshold=ERROR
20 log4j.appender.ROLLING_FILE.File=rolling.log
//文件位置,也可以用变量${java.home}、rolling.log
21 log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆盖
22 log4j.appender.ROLLING_FILE.MaxFileSize=10KB
//文件最大尺寸
23 log4j.appender.ROLLING_FILE.MaxBackupIndex=1
//备份数
24 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
25 log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
26    
27 #应用于socket
28 log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
29 log4j.appender.SOCKET.RemoteHost=localhost
30 log4j.appender.SOCKET.Port=5001
31 log4j.appender.SOCKET.LocationInfo=true
32 #
Set up for Log Facter 5
33 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
34 log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
35    
36 #
Log Factor 5 Appender
37 log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
38 log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
39 #
发送日志给邮件
40 log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
41 log4j.appender.MAIL.Threshold=FATAL
42 log4j.appender.MAIL.BufferSize=10
43 log4j.appender.MAIL.From=web@www.wuset.com
44 log4j.appender.MAIL.SMTPHost=www.wusetu.com
45 log4j.appender.MAIL.Subject=Log4J
Message
46 log4j.appender.MAIL.To=web@www.wusetu.com
47 log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
48 log4j.appender.MAIL.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
49 #
用于数据库
50 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
51 log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
52 log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
53 log4j.appender.DATABASE.user=root
54 log4j.appender.DATABASE.password=
55 log4j.appender.DATABASE.sql=INSERT
INTO LOG4J (Message) VALUES (’[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n’)
56 log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
57 log4j.appender.DATABASE.layout.ConversionPattern=[framework]
%d - %c -%-4r [%t] %-5p %c %x - %m%n
58    
59 log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
60 log4j.appender.A1.File=SampleMessages.log4j
61 log4j.appender.A1.DatePattern=yyyyMMdd-HH’.log4j’
62 log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
63 #自定义Appender
64 log4j.appender.im
= net.cybercorlin.util.logger.appender.IMAppender
65 log4j.appender.im.host
= mail.cybercorlin.net
66 log4j.appender.im.username
= username
67 log4j.appender.im.password
= password
68 log4j.appender.im.recipient
= corlin@cybercorlin.net
69 log4j.appender.im.layout=org.apache.log4j.PatternLayout
70 log4j.appender.im.layout.ConversionPattern
=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

其中:log4j.addivity.org.apache=true的作用在于 children-logger是否使用 rootLogger的配置,例如 输出终端。

四、使用日志的其他问题

在程序中输出日志可以直接写 log.debug(theResult); 有些程序又使用if判断:   

 if (log.isDebugEnabled()) {
        ... do something expensive ...
        log.debug(theResult);
    }
其实是关于log.debug()参数的问题,如果参数初始化代价大,则先if判断,避免多余的初始化,例如多个String对象拼接。如果只是简单的传参,则无所谓使用何种方式。不过有人说为了统一风格,全部使用if判断。这个看个人喜欢了。

参考:http://www.cnblogs.com/suman/archive/2010/10/23/1858864.html

http://www.blogjava.net/sy1214520/default.html?page=3

==================================================================================================================

Log4j介绍

log4j是类似于java.util.logging的日志作用,即记录一些有用信息,是一个日志框架;

log4j == log for Java

日志框架的作用:

(1)函数参数是否正确;

(2)软件发布后,记录用户的每一步操作;

(3)记录程序运行出错位置;

log4j在http://logging.apache.org/log4j/1.2/download.html 中进行下载;

log4j的api文档在log4j/site/apidocs/index.html中;

log4j可以改变日志记录的形式比如HTML、Simple等;

log4j可以改变日志输出的目的地,比如File、DB等;

 

二、配置使用Log4j

 

原本是一个zip包,取出jar包,并在Eclipse的某个Project build path导入;

 

三、简单的使用Log4j

 

log4j需要配置文件log4j.properties进行配置,log4j.properties位于src目录下;

 

log4j.properties规则:

(1)键值对;

(2)#代表注释;

(3)不支持中文;

 

Log4jDemo.java


01 package org.impl;
02
03 import org.apache.log4j.Logger;
04
05 public class Log4jDemo {
06     public static void main(String args[]){
07         Logger logger = Logger.getLogger(org.impl.Log4jDemo.class);
08         logger.debug("debug");
09         logger.info("info");
10         logger.error("error");
11     }
12 }
log4j.properties


1 log4j.rootLogger=debug,appender1
2 log4j.appender.appender1=org.apache.log4j.ConsoleAppender
3 log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout

显示结果:

1 [main]
DEBUG org.impl.Log4jDemo - debug
2 [main]
INFO org.impl.Log4jDemo - info
3 [main]
ERROR org.impl.Log4jDemo - error


这样一个简单的log4j应用。

 

这个配置文件的意思是:

rootLogger表示最低显示等级,即显示debug等级及以上的信息;

appender1表示一个名字;

ConsoleAppender表示输出到控制台,如果想要输出到文件,则可以使用FileAppender并制定文件名称;

TTCCLayout是一种布局方式;

debug等级表示在编译开发阶段的信息;

error等级表示错误信息;

info等级表示一般的信息;

 

如果看到如下信息:

1 log4j:WARN
No appenders could be found for logger (org.impl.Log4jDemo).
2 log4j:WARN
Please initialize the log4j system properly.
3 log4j:WARN
See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
表示配置文件位置不正确,应该放到src目录下!


四、逐步了解Log4j

任务1:将日志输出到指定文件

只需要修改配置文件即可,配置文件修改为:


1 log4j.rootLogger=debug,appender1
2 log4j.appender.appender1=org.apache.log4j.FileAppender
3 log4j.appender.appender1.File=./java0.log
4 log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout

 

这样就指定了日志输出到工程目录下的java0.log文件中;

注意:这个日志文件时追加类型的。

 

任务2:将日志输出以HTML格式输出(效果很好!)

修改配置文件为:

1 log4j.rootLogger=debug,appender1
2 log4j.appender.appender1=org.apache.log4j.FileAppender
3 log4j.appender.appender1.File=./java0.html
4 log4j.appender.appender1.layout=org.apache.log4j.HTMLLayout

即可;

 

任务3:同时输出到控制台和文件

修改配置文件为:

1 log4j.rootLogger=debug,appender1,appender2
2 log4j.appender.appender1=org.apache.log4j.FileAppender
3 log4j.appender.appender1.File=./log4j.HTML
4 log4j.appender.appender1.layout=org.apache.log4j.HTMLLayout
5
6 log4j.appender.appender2=org.apache.log4j.ConsoleAppender
7 log4j.appender.appender2.layout=org.apache.log4j.SimpleLayout

 

五、Log4j核心组件

 

1.Logger

 

设定了显示日志的级别;

常用级别为debug,info,warn,error,fatal;

 

2.Appender

 

设定了日志的输出目的;

常用有:

(1)ConsoleAppender

(2)FileAppender

(3)DailyRollingFileAppender  一天换一个文件

(4)JdbcAppender   输出到数据库
 

3.Layout

 

设定日志的内容格式;

 

常用有:

(1)HTMLLayout;

(2)TTCCLayout;

(3)PatternLayout;制定布局样式

 

如果要设置PatternLayout,必须将配置文件修改为以下形式:

 

1 log4j.rootLogger=debug,appender1,appender2
2 log4j.appender.appender1=org.apache.log4j.FileAppender
3 log4j.appender.appender1.File=./log4j.HTML
4 log4j.appender.appender1.layout=org.apache.log4j.HTMLLayout
5
6 log4j.appender.appender2=org.apache.log4j.ConsoleAppender
7 log4j.appender.appender2.layout=org.apache.log4j.PatternLayout
8
9 log4j.appender.appender2.layout.ConversionPattern=
格式名称


格式形式如下:


%p:日志优先级(debug、info)

%t:输出日志的线程名;

%d{yyyy-MM-dd HH:mm:ss}:时间;

%c:所属类名;

%r:日志输出所花时间;

%n:换行;

%l:日志所在行;

%m:信息;

%M:方法;

 

比如:


%r [%t] -%l %p %d{yyyy-MM-dd HH:mm:ss} %n

显示如下:

3 [main] -org.impl.Log4jDemo.main(Log4jDemo.java:10) ERROR 2012-01-11 17:11:37

 

3表示所花时间;

[main]表示线程;

org.impl.Log4jDemo.main(Log4jDemo.java:10) 表示   %l   ;

ERROR表示%p;


相关文章