Log4j介绍

Posted 鹤啸九天-西木

tags:

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

一、概述

        Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送到目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

        此外,通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且通过使用各种第三方扩展,可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。

二、构成

        Log4j由三个重要的组件构成:日志信息的优先级 priority,日志信息的输出目的地Appender,日志信息的输出格式(布局)layout。

        1、日志信息的优先级priority

        从低到高,依次有:DEBUG,INFO,WARN,ERROR,分别用来指定这条日志信息的重要程度;如果定义了输出的级别为INFO,则只有等于及高于这个级别的才进行处理,此时将输出INFO,WARN,ERROR。值得注意的是,级别中还有三个关键字:

        FATAL:能导致程序挂起的错误日志;

        ALL:打印所有的日志;

        OFF:关闭所有的日志输出。

        2、日志信息的输出目的地Appender

        org.apache.log4j.ConsoleAppender,将日志信息输出到控制台;属性有:

            Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。

              ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。

             Target=System.err:默认值是System.out。

        org.apache.log4j.FileAppender,将日志信息输出到一个文件;属性有:

            Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。

            ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。

            Append=false:true表示服务重启后消息是否增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。

            File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。

        org.apache.log4j.DailyRollingFileAppender,将日志信息输出到一个,并且每天输出到一个新的日志文件,按照不同的配置可以定义每月一个日志文件,或者每周,每天,每小时,每分钟等输出一个新的日志文件;属性有:

           Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。

           ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。

               Append=false:true表示服务重启后消息是否增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。

           File=D:/logs/logging.log4j:指定当前消息输出到logging.log4j文件中。

           DatePattern=‘.‘yyyy-MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为logging.log4j,前一个月的日志文件名为logging.log4j.yyyy-MM。也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:

          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:每分钟

        org.apache.log4j.RollingFileAppender,将日志信息输出到一个文件,通过指定文件的的尺寸,当文件大小到达指定尺寸的时候会自动把文件改名,如名为example.log的文件会改名为example.log.1,同时产生一个新的example.log文件。如果新的文件再次达到指定尺寸,又会自动把文件改名为example.log.2,同时产生一个example.log文件。依此类推,直到example.log. MaxBackupIndex,MaxBackupIndex的值可在配置文件中定义。属性有:

           Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。

           ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。

           Append=false:true表示服务重启后消息是否增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。

           File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。

           MaxFileSize=100KB:后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中。

           MaxBackupIndex=2:指定可以产生的滚动文件的最大数,例如,设为2则可以产生logging.log4j.1,logging.log4j.2两个滚动文件和一个logging.log4j文件。

        org.apache.log4j.WriterAppender,将日志信息以流格式发送到任意指定的地方。

        org.apache.log4j.jdbc.JDBCAppender,通过JDBC把日志信息输出到数据库中。

        org.apache.log4j.net.SMTPAppender,将日志信息以邮件的方式发送到指定的邮箱。

        3、日志信息的输出格式布局Layout

        Log4j提供的布局模式有以下几种:

        org.apache.log4j.htmlLayout:以HTML表格形式布局,属性有:

             LocationInfo=true:输出java文件名称和行号,默认值是false。

             Title=My Logging: 默认值是Log4J Log Messages。

      org.apache.log4j.SimpleLayout:包含日志信息的级别和信息字符串

      org.apache.log4j.TTCCLayout:包含日志产生的时间、线程、类别等等信息

      org.apache.log4j.PatternLayout:可以灵活地指定布局模式;

         ConversionPattern=%m%n:自定义日志信息输出格式。

格式字符

含义


c

输出logger name


C

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


d

输出日期时间信息,默认格式为ISO8601,也可以在其后指定格式,比如:

%d{yyyy-MM-dd HH:mm:ss },输出类似:2002-10-18 22:10:28;

格式可以参考 java类 SimpleDateFormat,不过按照此类的设置会影响速度。

可以选择Log4j内置格式: %d{ISO8601},%d{ABSOLUTE},

%d{RELATIVE}或者log4j的ISO8601DateFormat,

AbsoluteTimeDateFormat,RelativeTimeDateFormat 和 DateTimeDateFormat 方式

f

输出日志信息所属类所在的文件名


l

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


L

输出日志语句所在源文件的行号


m

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


M

输出日志信息中所发生的方法名


n

输出平台相关的换行符,


p

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


r

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


t

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


x

输出与当前线程相关联的NDC(Nested Diagnostic Context)信息


X

输出与当前想成相关联的MDC(Mapped Diagnostic Context)信息


%

输出%

可以在%与格式字符之间加上修饰符来控制其最小宽度、最大宽度和文本的对齐方式。如:
       1)%20c:指定输出logger的名称,最小的宽度是20,如果logger的名称小于20的话,默认的情况下右对齐。
       2)%-20c:指定输出logger的名称,最小的宽度是20,如果logger的名称小于20的话左对齐,"-"号指定左对齐。
       3)%.30c:指定输出logger的名称,最大的宽度是30,如果logger的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
       4)%20.30c:如果logger的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。

三、配置

        Log4j支持两种配置方式,分别是.properties 二进制文件和.xml文件的方式。需要log4j-1.2.15.jar

        1、.properties方式

.proterties文件:

log4j.rootLogger=DEBUG,CONSOLE,FILE,ROLLING_FILE,SOCKET,LF5_APPENDER,MAIL,DATABASE,A1,A8,im
log4j.addivity.org.apache=true
################### 
# Console Appender 
################### 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.Threshold=DEBUG 
log4j.appender.CONSOLE.Target=System.out 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
##################### 
# File Appender 
##################### 
log4j.appender.FILE=org.apache.log4j.FileAppender 
log4j.appender.FILE.File=file.log 
log4j.appender.FILE.Append=false 
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
# Use this layout for LogFactor 5 analysis
######################## 
# Rolling File 
######################## 
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender 
log4j.appender.ROLLING_FILE.Threshold=ERROR 
log4j.appender.ROLLING_FILE.File=rolling.log 
log4j.appender.ROLLING_FILE.Append=true 
log4j.appender.ROLLING_FILE.MaxFileSize=10KB 
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#################### 
# Socket Appender 
#################### 
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender 
log4j.appender.SOCKET.RemoteHost=localhost 
log4j.appender.SOCKET.Port=5001 
log4j.appender.SOCKET.LocationInfo=true 
# Set up for Log Facter 5 
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout 
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
######################## 
# Log Factor 5 Appender 
######################## 
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender 
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
######################## 
# SMTP Appender 
####################### 
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
log4j.appender.MAIL.Threshold=FATAL 
log4j.appender.MAIL.BufferSize=10 
[email protected]
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com 
log4j.appender.MAIL.Subject=Log4J Message 
[email protected]
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout 
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
######################## 
# JDBC Appender 
####################### 
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test 
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver 
log4j.appender.DATABASE.user=root 
log4j.appender.DATABASE.password= 
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') 
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout 
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
######################## 
# DailyRollingFile Appender 
####################### 
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.A1.File=SampleMessages.log4j 
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' 
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
################### 
#NT2000日志 Appender 需把Log4j压缩包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目录下
################### 
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest
log4j.appender.A8.layout=org.apache.log4j.PatternLayout
log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
################### 
#自定义Appender 
################### 
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net 
log4j.appender.im.username = username 
log4j.appender.im.password = password 
log4j.appender.im.recipient = [email protected]
log4j.appender.im.layout=org.apache.log4j.PatternLayout 
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

java文件:

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

public class Test {
    static Logger logger = Logger.getLogger(Test.class);
    public static void main(String args[]) {
       //以property方式读到配置文件。
       PropertyConfigurator.configure("log4j.properties");
       logger.debug("Here is some DEBUG");
       logger.info("Here is some INFO");
       logger.warn("Here is some WARN");
       logger.error("Here is some ERROR");
       logger.fatal("Here is some FATAL");
    }
}

        2、.xml方式

.xml文件

<?xml version="1.0" encoding="UTF-8"?>   
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">   
        <layout	class="org.apache.log4j.PatternLayout">   
	    <param name="ConversionPattern" value="%-4r [%t] %-5p %c %x - %m%n" /> 
	</layout>
	<filter class="org.apache.log4j.varia.LevelRangeFilter">   
            <param name="LevelMin" value="INFO" />   
            <param name="LevelMax" value="WARN" />   
        </filter>    
    </appender>   
    <appender name="FILE" class="org.apache.log4j.RollingFileAppender">   
        <param name="File" value="E:/log.log" />   
        <param name="Append" value="true" />   
        <param name="MaxFileSize" value="500KB" />   
        <param name="MaxBackupIndex"   value="2"/>   
        <layout class="org.apache.log4j.PatternLayout">   
            <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
        </layout>   
    </appender>   
      
    <root>   
        <priority value="debug"/>   
        <appender-ref ref="STDOUT"/>   
        <appender-ref ref="FILE"/>     
    </root>   
</log4j:configuration>

java文件:

import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

public class Test{
    static Logger logger = Logger.getLogger(Test.class);
    public static void main(String args[]) {
        //以XML方式读到配置文件。
        DOMConfigurator.configure("log4j.xml");
        logger.debug("Here is some DEBUG");
        logger.info("Here is some INFO");
        logger.warn("Here is some WARN");
        logger.error("Here is some ERROR");
        logger.fatal("Here is some FATAL");
    }
}

不管是.properties方式还是.xml方式都需要在web.xml中配置

<servlet>   
    <servlet-name>InitLog4j</servlet-name>   
    <servlet-class>com.yourcompany.log4j.InitLog4j</servlet-class>   
    <init-param>   
        <param-name>log4j</param-name>   
	<param-value>/WEB-INF/log4j.xml</param-value>   
    </init-param>   
    <load-on-startup>1</load-on-startup>   
</servlet>  


参考:http://www.cnblogs.com/ITtangtang/p/3926665.html

           http://www.blogjava.net/DLevin/archive/2012/07/04/382131.html




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

Log4j介绍

Log4j介绍

log4j介绍以及使用教程

从log4j日志无缝迁移至logback

(转)log4j使用介绍

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