• 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平台为" ",Unix平台为" "   

          %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有了初步的认识,至于再深的层面,例如其架构等等,各位朋友可以随兴趣喜好,自行研究。

  • 相关阅读:
    POJ 2029 (二维树状数组)题解
    HDU 4819 Mosaic (二维线段树&区间最值)题解
    HDU 1823 Luck and Love (二维线段树&区间最值)题解
    POJ1061 青蛙的约会(扩展欧几里得)题解
    POJ 2155 Matrix (二维树状数组)题解
    POJ 1751 Highways(最小生成树&Prim)题解
    HDU 6148 Valley Numer (数位DP)题解
    HDU3652 B-number(数位DP)题解
    HDU 4734 (数位DP)题解
    HDU 2089 不要62 (数位DP)题解
  • 原文地址:https://www.cnblogs.com/struggletofly/p/log4j.html
Copyright © 2020-2023  润新知