Log4j应用

    注:本资料通过网络查找,通过一些实践,最终整理而成。

      在log4j的应用层面,配置文件是其最重要的一点。配置文件的种类分为xml和property两种。由于博主在项目中使用的多为property类型的配置文件,所以在接下来 的叙述中,主要针对这一方面。对于想对xml配置类型有所了解的朋友,推荐链接:http://blog.csdn.net/hu_shengyang/article/details/6754031

一. 配置文件理论

      首先,log4j的日志级别(由低到高):All,debug,info,warn,error,fatal,off    

      其次,log4j主要由三大组件组成,分别是Logger,Appender,Layout。  

      1.  Logger

      log4j支持多种Logger,命名对大小写敏感,且体现了隶属关系,用"."分隔。 其中rootLogger为根Logger,它永远存在,通过调用

public static Logger Logger.getRootLogger()

获得;其他Logger,都是其子Logger,通过调用

public static Logger Logger.getLogger(String name) 

或者

public static Logger Logger.getLogger(Class clazz)

获得(创建)。后者相当于调用Logger.getLogger(clazz.getName())。

      注:(1)用同名参数调用Logger.getLogger(String name)将返回同一个 logger的引用。故可以在一个地方配置logger, 在另外一个地方获得配置好的logger,而无须相互间传递logger的引用。

            (2)logger的创建可以按照任意的顺序,即,父logger可以后于子logger被创建。 log4j将自动维护logger的继承树。(没有验证)    

      2. Appender:日志目的地。

      每个Logger都可以拥有一个或多个Appender.我们也可以自己定义Appender类,只要在配置文件中配置全路径即可。具体参见配置文件样例。目前提供的且常用的appender主要有以下几种: 

       控制台(ConsoleAppender),文件(FileAppender,RollingFileAppender,DailyRollingFileAppender),数据库(JDBCAppender),邮件(SMTPAppender)  

      3. Layout: 日志格式化。

      格式化的实现类有PatternLayout,HTMLLayout等。具体格式化的结果,是通过ConversionPattern指定,它所拥有的参数如下:

      %c 输出日志信息所属的类的全名          

      %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2013-12-16 23:58:28

      %f 输出日志信息所属的类的类名    

      %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行   

      %m 输出代码中指定的信息,如log(message)中的message   

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

      %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推  

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

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

二.配置文件样例  

       首先:定义Appender.  

       Appender为控制台:

log4j.appender.stuout=org.apache.log4j.ConsoleAppender    
#此处有两种类型,System.out(输出黑字)和System.err(输出红字)    
log4j.appender.stuout.Target
=System.out
log4j.appender.stuout.layout=org.apache.log4j.PatternLayout
log4j.appender.stuout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c:%L]-[%p] %m%n

      Appender为文件(以天为单位,每天一个文件):

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender    
log4j.appender.R.File=D:/test/test.log
#注意此处用引号引起来
log4j.appender.R.DatePattern='.'yyyy-MM-dd'.log'
#如果需要HTML格式,则只需要指定:log4j.appender.R.layout=org.apache.log4j.HTMLLayout
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c:%L]-[%p] %m%n

       Appender为数据库:

log4j.appender.A3 = org.apache.log4j.jdbc.JDBCAppender    
log4j.appender.A3.BufferSize = 0
log4j.appender.A3.Driver = net.sourceforge.jtds.jdbc.Driver
#此处其实不需要转义,如log4j.appender.A3.URL = jdbc:jtds:sqlserver://127.0.0.1:1433;DataBaseName=DB_JY;charset=GBK
log4j.appender.A3.URL = jdbc\:jtds\:sqlserver\://127.0.0.1\:1433;DataBaseName\=DB_JY;charset\=GBK
log4j.appender.A3.User = sa
log4j.appender.A3.Password = sa
log4j.appender.A3.layout = org.apache.log4j.PatternLayout
#此处首先要在数据库中建好对应字段类型的表。
log4j.appender.A3.layout.ConversionPattern = INSERT INTO DB_JY..log4j(createDate, thread, priority, category, message) values('%d', '%t', '%-5p', '%c', '%m')

       Appender为邮件:

#可以指定自己的Appender实现,如log4j.appender.MAIL=testLog4j.SelfSMTPAppender      
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=error
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.SMTPHost=smtp.163.com
log4j.appender.MAIL.Subject=ErrorMessage
log4j.appender.MAIL.SMTPUsername=xxxxxx@163.com
log4j.appender.MAIL.SMTPPassword=xxxxxx
log4j.appender.MAIL.From=xxxx
log4j.appender.MAIL.To=xxxx
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout

       其次:  将appender指定到对应的logger上,我们现在将他定义到rootLogger上:

log4j.rootLogger = debug,stuout,R,A3,MALL    

       小技巧:  

           (1)根据包划分不同的日志输出级别:    

log4j.logger.com.text1 = error       
log4j.logger.com.text2 = debug 

           (2)根据不同的Appender设置不同的输出级别,但一般不建议这样用:有一个属性Threshold可以单独控制各个appender,如下:

log4j.appender.MAIL.Threshold=error          
log4j.appender.stuout.Threshold=error

       注:(1)配置文件对大小写敏感,且有些地方属性的value后,不能有空格。

            (2)对于不同的Appender,也需要一些其他的jar包支持,例如本例中:数据库,则需要引入对应的数据库驱动,  邮件,则需要引入:mail.jar和activation.jar。

三:log4j在程序中的使用   

       引入jar包,log4j.jar,此时可以通过第一点中的Logger.getLogger方法获取Logger对象。但由于面向接口编程的思想,更好的做法是   再引入commons-logging.jar,通过LogFactory.getLog方法,来获取Logger对象。具体代码如下:

private static void Log LOG = LogFactory.getLog(**.class);   

        这里有必要说明一下commongs-logging的加载顺序:   

       (1).common-logging首先在CLASSPATH中查找commons-logging.properties文件。这个属性文件至少定义org.apache.commons.logging.Log属性,它的值应该是上述任意Log接口实现的完整限定名称。如果找到 org.apache.commons.logging.Log属相,则使用该属相对应的日志组件。结束发现过程。        

       (2).如果上面的步骤失败(文件不存在或属相不存在),common-logging接着检查系统属性org.apache.commons.logging.Log。如果找到org.apache.commons.logging.Log系统属性,则使用该系统属性对应的日志组件。结束发现过程。        

       (3).如果找不到org.apache.commons.logging.Log系统属性,common-logging接着在CLASSPATH中寻找log4j的类。如果找到了就假定应用要使用的是log4j。不过这时log4j本身的属性仍要通过log4j.properties文件正确配置。结束发现过程。        

       (4).如果上述查找均不能找到适当的Logging API,但应用程序正运行在JRE 1.4或更高版本上,则默认使用JRE 1.4的日志记录功能。结束发现过程。        

       (5).最后,如果上述操作都失败(JRE 版本也低于1.4),则应用将使用内建的SimpleLog。SimpleLog把所有日志信息直接输出到System.err。结束发现过程。          

     

        为了简化配置 commons-logging ,一般不使用 commons-logging 的配置文件,也不设置与 commons-logging 相关的系统环境变量, 而只需将 Log4j 的 Jar 包放置到 classpash 中就可以了,然后将log4j.properties放到合适的位置,程序就可以使用了。使用的时,建议调用   

LOG.error(Object message, Throwable t)

类似的重载方法,这样是可以打印出堆栈信息,便于我们定位和调试。具体代码如下:   

LOG.error("**错误", e);        

        希望大家看完后,对log4j有了初步的认识,至于再深的层面,例如其架构等等,各位朋友可以随兴趣喜好,自行研究。

posted @ 2013-12-17 00:55  struggle to fly  阅读(879)  评论(2编辑  收藏  举报