log4j

参考连接: http://www.iteye.com/topic/378077 html

推荐使用1.2.X版,下载地址:java

http://logging.apache.org/log4j/1.2/download.html web

若是使用Maven管理项目, 添加maven依赖sql

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>provided</scope>
        </dependency>

 

1、入门实例

1.新建一个Java工程,导入包log4j-1.2.17.jar,整个工程最终目录以下数据库

二、src同级建立并设置log4j.propertiesapache

    类在编译的时候log4j.jar默认的状况是到classpath下查找默认的配置文件log4j.properties。 把log4j.properteis放到src目录下面, 在编译后会自动把配置文件复制到classpath。 这样就能够找到配置文件。 多线程

### 设置###oracle

log4j.rootLogger = debug,stdout,FILE,E
### 设置根logger ###
log4j.rootLogger = debug, stdout, FILE, E
 
### 设置输出信息到stdout ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.encoding = UTF-8
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p]%l - %m%n
 
### 输出DEBUG级别信息到 ./result/log/debug.log ###
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File = ./result/log/debug.log
log4j.appender.FILE.encoding = UTF-8
log4j.appender.FILE.Append = false
log4j.appender.FILE.Threshold = DEBUG
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d-%-4r [%t]%-5p%l %x- %m%n
 
### 输出ERROR 级别以上的日志到./result/log/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = ./result/log/debug.log
log4j.appender.E.encoding = UTF-8
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %d-%-4r [%t]%-5p%l %x- %m%n

三、设置日志内容app

package com.mucfc;
import org.apache.log4j.Logger;
/**
 *@author linbingwen
 *@2015年5月18日9:14:21
 */
public class Test {
 private static Logger logger = Logger.getLogger(Test.class);  
    public static void main(String[] args) {  
        // System.out.println("This is println message.");  
        // 记录debug级别的信息  
        logger.debug("This is debug message.");  
        // 记录info级别的信息  
        logger.info("This is info message.");  
        // 记录error级别的信息  
        logger.error("This is error message.");  
    }  
}

四、输出结果socket

(1)首先是控制台的信息

(2)再来看输出的文件

内容以下,发现已按照要求输出到对应的文档中去了。

 经过配置文件可知,咱们须要配置3个方面的内容:

一、根目录(级别和目的地);

二、目的地(控制台、文件等等);

三、输出样式。

Log4J的类图:主要由三大组件组成:loggers,appenders和layouts

2、Log4j基本使用方法

2.一、定义配置文件

其实您也能够彻底不使用配置文件,而是在代码中配置Log4j环境。可是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面咱们介绍使用Java特性文件作为配置文件的方法:
1. 配置根Logger,其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。

    日志级别从高到低分为:
A:off 最高等级,用于关闭全部日志记录。
B:fatal 指出每一个严重的错误事件将会致使应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warn 代表会出现潜在的错误情形。
E:info 通常和在粗粒度级别上,强调应用程序的运行全程。
F:debug 通常用于细粒度级别上,对调试应用程序很是有帮助。

G:all 最低等级,用于打开全部日志记录。

        Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。经过在这里定义的级别,您能够控制到应用程序中相应级别的日志信息的开关。好比在这里定 义了INFO级别,则应用程序中全部DEBUG级别的日志信息将不被打印出来。 appenderName就是指日志信息输出到哪一个地方。您能够同时指定多个输出目的地。

配置自定义Logger组件的语法为:

log4j.logger.loggerName=[priority],appenderName,appenderName,...-

log4j.rootLogger=INFO,stdout,R

 此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,能够任意起名。

2.配置日志信息输出目的地Appender 

appender的任务是把layout格式化好的输出内容送往指定的目的地。每一个appender都和一个layout相联系, 
layout的任务是格式化用户的logging request。其语法为:

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

log4j.appender.appenderName.option1 = value1 … 

log4j.appender.appenderName.option = valueN
 
好比:
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File = ./result/log/debug.log
log4j.appender.FILE.encoding = UTF-8
log4j.appender.FILE.Append = false
log4j.appender.FILE.Threshold = DEBUG
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d-%-4r [%t]%-5p%l %x- %m%n
 
    

其中,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:指定日志消息的输出最低层次。
Append=false:默认值是true,即将消息增长到指定文件中,false指将消息覆盖指定的文件内容。
encoding = UTF-8 设置输出log的编码格式
ImmediateFlush=true:默认值是true,意谓着全部的消息都会被当即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。

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有以e几种:

  • org.apache.log4j.HTMLLayout(以HTML表格形式布局) 
  • org.apache.log4j.PatternLayout(能够灵活地指定布局模式)  
  • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) 
  • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

Log4J采用相似C语言中的printf函数的打印格式格式化日志信息,打印参数以下: %m 输出代码中指定的消息 

log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

若是使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数以下:

l   [QC]是log信息的开头,能够为任意字符,例如项目简称。

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

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

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

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

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

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

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

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

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

l   %L: 输出代码中的行号

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

l   %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字符,就从左边较远输出的字符截掉。 

2.二、在代码中使用Log4j

1.获得记录器

使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为: 

  • public static Logger getLogger(String name) 
  • public staticLogger Logger.getLogger(Class clazz)至关于调用Logger.getLogger(clazz.getName()),该方法被认为是目前所知的最理智的命名logger的方法。

    private final static Logger logger = Logger.getLogger(BaseParpare.class.getName());
 

2.读取配置文件

当得到了日志记录器以后,第二步将配置Log4j环境,其语法为:

BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。 
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
 
log4j配置文件位置详解

自动加载配置文件:

(1)若是采用log4j输出日志,要对log4j加载配置文件的过程有所了解。log4j启动时,默认会寻找source folder下的log4j.xml配置文件,若没有,会寻找log4j.properties文件。而后加载配置。配置文件放置位置正确,不用在程序中手动加载log4j配置文件。若是将配置文件放到了config文件夹下,在build Path中设置下就行了。

若要手动加载配置文件以下:

(1)PropertyConfigurator.configure("log4j.properties") 默认读取的是项目根目录的路径。此时的log4j.properties要放在项目目录下。

如图,log4j.properties和src是同级目录,同在根目录下

(2)通常,一个java项目会有不少的配置文件,建议把全部的配置文件放到一个文件夹下,

例如,放到config文件夹。那么在读取这些配置文件的时候要加上子目录名称。

如图在项目目录下建立config文件夹(注意:不是在src文件下),此时,config和src是同级目录

这时,读取路径改成:

PropertyConfigurator.configure("config/log4j.properties");

(3):若是不手动设置,不用人为的写加载log.properties文件的代码时,直接放src目录下,千万要记得,若是新建一个JAVA项目,src文件要弄成原文件包才行

我就是用的这个

(4)项目打成jar包时,通常不会把配置文件也打进jar包。

若是是第一种方式,直接将log4j.properties文件和生成的HelloWorld.jar放在同一目录下,项目就能顺利读取配置文件。

若是是第二种方式,要创建config文件夹,把配置文件放入其中,再将config文件和生成的HelloWorld.jar放在同一目录下,项目就能顺利读取配置文件。

 思考:log4j.properties配置文件,配置简单,但不支持复杂过滤器filter,log4j.xml虽然配置文件看似复杂,但支持复杂过滤器和Log4j的新特性。推荐使用log4j.xml

3.插入记录信息(格式化日志信息)

当上两个必要步骤执行完毕,您就能够轻松地使用不一样优先级别的日志记录语句插入到您想记录日志的任何地方,其语法以下:

 
   
Logger.debug ( Object message ) ; 
Logger.info ( Object message ) ; 
Logger.warn ( Object message ) ; 
Logger.error ( Object message ) ;
 
     

5. 继承关系

Log4J提供了一个root Logger,它是全部Logger组件的“祖先”,它永远存在,且不能经过名字检索或引用,经过Logger.getRootLogger()方法取得它。

可在配置文件中方便地配置存在继承关系的Logger组件,凡是在符号“.”后面的组件都会成为在符号“.”前面的Logger组件的子类。例如:-

   log4j.apache.myLogger=WARN-

   log4j.apache.myLogger.mySonLogger=,file-

以上代码中, mySonLogger是myLogger的子类Logger组件。 

6. 以包为单位指定日志等级

log4j.logger.com.neareast =DEBUG

log4j.logger.org.apache.struts=WARN

指定com.neareast包下的全部类的等级为DEBUG。

指定struts 包下的全部类的等级为WARN。 

7. 基本使用方法

public staticLogger Logger.getLogger(Class clazz)至关于调用Logger.getLogger(clazz.getName()),该方法被认为是目前所知的最理智的命名logger的方法。

    static Logger logger = Logger.getLogger(BaseParpare.class.getName());
 
其余用方法:

一、使用org.apache.commons.logging.Log类:

例如private final Log log = LogFactory.getLog(getClass()); 

二、直接使用log4j的Logger类:

得到rootLogger:Logger rootLogger=Logger.getRootLogger();-

得到自定义Logger:Logger myLogger =Logger.getLogger("log4j.logger.myLogger"); 

Logger由一个String类的名字识别,根logger(root logger)是全部logger的祖先,它具备以下属性:1)它老是存在的;2)它不能够经过名字得到。 

两种方法的区别:

LogFactory来自common-logging包。若是用LogFactory.getLog:

优势:你能够用任何实现了通用日志接口的日志记录器替换log4j,而程序不受影响。

缺点:须要多一个common-logging包,这勉强算一个缺点。

Logger来自log4j本身的包。若是用Logger.getLogger:

优势:你只须要一个log4j的jar包。

缺点:你只能用log4j做为日志记录器,由于log4j已经硬编码进你的系统了。

apache的common-logging包是通用日志接口,经过这个中间层,你能够经过其配置文件commons-logging.properties,来指定到底用哪一个日志系统,以此增长系统的灵活性。

另:

为尽量的提升系统性能,减少没必要要的性能损耗,使用相似下面的判断能够在某级别的日志被关闭时,避免隐性的性能损耗(即便不须要输出日志,大量debug等语句的参数处理也须要消耗可观的计算量):

  1. if(logger.isDebugEnabled() {  
  2.     logger.debug("Entry number: " + i + " is " +String.valueOf(entry[i]));  
  3. }  

要将异常信息写入日志,使用e.getMessage()方法并不能获得正确的异常栈。要输出完整的异常栈,能够定义一个getTrace方法,而后使用logger.debug(getTrace(e))来记录日志;getTrace方法定义以下:

  1. public String getTrace(Throwable t) {  
  2.     StringWriter stringWriter= new StringWriter();  
  3.     PrintWriter writer= new PrintWriter(stringWriter);  
  4.     t.printStackTrace(writer);  
  5.     StringBuffer buffer= stringWriter.getBuffer();  
  6. return buffer.toString();  
  7. }  

8.       配置文件示例

  1. log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE,ROLLING_FILE  
  2. #log4j.logger.cn.com.cnpc.backGroundServer.component.messageComponent=DEBUG,CONSOLE,FILE,ROLLING_FILE  
  3. #children-logger是否使用 rootLogger的配置  
  4. log4j.additivity.org.apache=false  
  5. # 应用于控制台  
  6. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender  
  7. log4j.appender.CONSOLE.Target=System.out  
  8. log4j.appender.CONSOLE.encoding=utf-8  
  9. log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout  
  10. log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p]%l - %m%n  
  11. #应用于文件  
  12. log4j.appender.FILE=org.apache.log4j.FileAppender  
  13. log4j.appender.FILE.File=E:/work/logs/OfflineMap.log  
  14. log4j.appender.FILE.Append=false  
  15. log4j.appender.FILE.encoding=utf-8  
  16. log4j.appender.FILE.layout=org.apache.log4j.PatternLayout  
  17. log4j.appender.FILE.layout.ConversionPattern=%d-%-4r [%t]%-5p%l %x- %m%n  
  18. # 应用于文件回滚  
  19. log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender  
  20. log4j.appender.ROLLING_FILE.File=E:/work/logs/OfflineMap.r.log  
  21. log4j.appender.ROLLING_FILE.Threshold=INFO  
  22. log4j.appender.ROLLING_FILE.Append=true  
  23. log4j.appender.ROLLING_FILE.Encoding=utf-8  
  24. log4j.appender.ROLLING_FILE.MaxFileSize=10240KB  
  25. log4j.appender.ROLLING_FILE.MaxBackupIndex=10  
  26. log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout  
  27. log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r[%t] %-5p %c %x - %m%n  
  28. # 天天新建日志  
  29. log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender  
  30. log4j.appender.A1.File=C:/log4j/log  
  31. log4j.appender.A1.Encoding=GBK  
  32. log4j.appender.A1.Threshold=DEBUG  
  33. log4j.appender.A1.DatePattern='.'yyyy-MM-dd  
  34. log4j.appender.A1.layout=org.apache.log4j.PatternLayout  
  35. log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n  
  36. # 用于数据库  
  37. log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender  
  38. log4j.appender.DATABASE.URL=jdbc:oracle:thin:@90.0.12.20:1521:ORCL  
  39. log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver  
  40. log4j.appender.DATABASE.user=Nation  
  41. log4j.appender.DATABASE.password=1  
  42. log4j.appender.CONSOLE.Threshold=WARN  
  43. log4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread,infolevel,class,messages) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l','%m')  
  44. # INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c%x - %m%n')  
  45. # 写入数据库中的表LOG4J的Message字段中,内容%d(日期)%c:日志信息所在地(类名)%p:日志信息级别%m: 产生的日志具体信息 %n: 输出日志信息换行  
  46. log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout  
  47. log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t]%-5p %c %x - %m%n  
  48. #自定义Appender  
  49. log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender  
  50. log4j.appender.im.host = mail.cybercorlin.net  
  51. log4j.appender.im.username = username  
  52. log4j.appender.im.password = password  
  53. log4j.appender.im.recipient = corlin@cybercorlin.net  
  54. log4j.appender.im.layout=org.apache.log4j.PatternLayout  
  55. log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p%c %x - %m%n  
  56. #应用于socket  
  57. log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender  
  58. log4j.appender.SOCKET.RemoteHost=localhost  
  59. log4j.appender.SOCKET.Port=5001  
  60. log4j.appender.SOCKET.LocationInfo=true  
  61. log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout  
  62. log4j.appender.SOCKET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n  
  63. #LogFactor 5 Appender  
  64. log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender  
  65. log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000  
  66. log4j.appender.LF5_APPENDER.layout=org.apache.log4j.PatternLayout  
  67. log4j.appender.LF5_APPENDER.layout.ConversionPattern =[framework] %d - %c -%-4r[%t] %-5p %c %x - %m%n  
  68. #发送日志给邮件  
  69. log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender  
  70. log4j.appender.MAIL.Threshold=FATAL  
  71. log4j.appender.MAIL.BufferSize=10  
  72. log4j.appender.MAIL.From=web@www.wuset.com  
  73. log4j.appender.MAIL.SMTPHost=www.wusetu.com  
  74. log4j.appender.MAIL.Subject=Log4J Message  
  75. log4j.appender.MAIL.To=web@www.wusetu.com  
  76. log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout  
  77. log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t]%-5p %c %x - %m%n  M,/:"pIO78651`
相关文章
相关标签/搜索