一、日志系统介绍
日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息是寸步难行的。所以在系统加入日志是必须的。
最原始的日志方式,就是在程序的适当地方添加System.out.println()方法,但是带来的问题是,系统稳定后,日志太大,如果要减少日志量,就需要重新修改程序,虽然只是注释掉System.out.println()方法。但是万一系统再次出错,又要改。
commons-logging提供分级日志功能,相当于把System.out.println()方法加强了,原来是一定输出到控制台,现在commons-logging有6级日志,但是apache建议使用4级,即ERROR、WARN、INFO、 DEBUG。什么情况下输出日志由程序中写日志的方法决定,输出什么级别以上的日志和输出到哪里由配置文件决定。
使用commons-logging如下:
02 |
import org.apache.commons.logging.Log; |
03 |
import org.apache.commons.logging.LogFactory; |
07 |
private static Log log = LogFactory.getLog(TestLog. class ); |
08 |
public static void main(String[] args){ |
当然还要配置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 |
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 |
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 |
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 |
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 |
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 |
37 |
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender |
38 |
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 |
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 |
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 |
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 |
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
03 |
import org.apache.log4j.Logger; |
05 |
public class Log4jDemo { |
06 |
public static void main(String args[]){ |
07 |
Logger logger = Logger.getLogger(org.impl.Log4jDemo. class ); |
08 |
logger.debug( "debug" ); |
10 |
logger.error( "error" ); |
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 |
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 |
6 |
log4j.appender.appender2=org.apache.log4j.ConsoleAppender |
7 |
log4j.appender.appender2.layout=org.apache.log4j.PatternLayout |
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;