log4j

Posted ziyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j相关的知识,希望对你有一定的参考价值。

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

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

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

如果使用Maven管理项目, 添加maven依赖

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

 

一、入门实例

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

技术分享

2、src同级创建并设置log4j.properties

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

### 设置###

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

3、设置日志内容

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);  

    /** 
     * @param args 
     */  
    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.");  
    }  

}

4、输出结果

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

技术分享

(2)再来看输出的文件

技术分享

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

技术分享

技术分享

 通过配置文件可知,我们需要配置3个方面的内容:

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

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

3、输出样式。


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

技术分享

二、Log4j基本使用方法

2.1、定义配置文件

其实您也可以完全不使用配置文件,而是在代码中配置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(将日志信息以流格式发送到任意指定的地方)

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

 

                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:指定可以产生的滚动文件的最大数。

 

2.2、在代码中使用Log4j

1.得到记录器

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

  • public static Logger getLogger( String name) 

通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如: 

static Logger logger = Logger.getLogger (ServerWithLog4j.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());
 
其他用方法:

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

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

2、直接使用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 = [email protected]  
  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=[email protected]  
  73. log4j.appender.MAIL.SMTPHost=www.wusetu.com  
  74. log4j.appender.MAIL.Subject=Log4J Message  
  75. log4j.appender.MAIL.To=[email protected]  
  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`


 








































以上是关于log4j的主要内容,如果未能解决你的问题,请参考以下文章

log4j怎样控制只输出自己写的代码的日志,不输出框架中的日志

Log4j反序列化远程代码执行漏洞(CVE-2019-17571)

由log4j远程执行漏洞说起

混合 log4j 1.x 和 log4j 2

Java 标准日志工具 Log4j 的使用(附源代码)

log4jspringboot项目启动 ,使用的druid数据源,log4j报错 log4j:WARN Please initialize the log4j system properly.(代码片