Log4j日志配置详解

一、log4j日志简介
html

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

日志信息的级别分为四级,优先级从高到低有DEBUG、INFO、WARN、ERROR,用来指定这条日志信息的重要程度;mysql

日志信息的输出目的地指定了日志将打印到控制台仍是文件中;spring

日志信息的输出格式则控制了日志信息的显示内容sql

注意:Log4j日志级别是定义在org.apache.log4j.Level类中,能够看源码。Log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。apache

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

mybatis


二、log4j配置文件app

log4j的配置文件分为两种, log4j.xmllog4j.properties,推荐使用log4j.xml。函数

2.一、 log4j.xml 详解spa

注意:

<root>、<logger>和<category>的关系

loggercategory的子类,category如今已经不提倡使用了。

loggercategory中的additivity属性,additivity="false" 则表示在category中定义日志输在root中过滤掉


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration>
    <!-- ========================== 自定义输出格式说明================================ -->  
    <!-- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL -->  
    <!-- %r 输出自应用启动到输出该log信息耗费的毫秒数  -->  
    <!-- %c 输出所属的类目,一般就是所在类的全名 -->  
    <!-- %t 输出产生该日志事件的线程名 -->  
    <!-- %n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” -->  
    <!-- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也能够在其后指定格式,好比:%d{yyy MMM dd HH:mm:ss,SSS},输出相似:2002年10月18日 22:10:28,921  -->  
    <!-- %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)  -->  
    <!-- ========================================================================== -->  
    
    <!-- ========================== 输出方式说明================================ -->  
    <!-- Log4j提供的appender有如下几种:  -->  
    <!-- org.apache.log4j.ConsoleAppender(控制台),  -->  
    <!-- org.apache.log4j.FileAppender(文件),  -->  
    <!-- org.apache.log4j.DailyRollingFileAppender(天天产生一个日志文件), -->  
    <!-- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),  -->  
    <!-- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)   -->  
     <!-- ========================================================================== -->  
    

    <!--输出到控制台-->
    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
        <!--Threshold是个全局的过滤器,他将把低于所设置的level的信息过滤不显示出来--> 
        <param name="Threshold" value="DEBUG" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n" />
        </layout>
    </appender>
    
    <!-- 系统应用级别日志,日志达到必定大小后,产生新的问题 -->
    <appender name="fileMaxAppenderAll" class="org.apache.log4j.RollingFileAppender">
        <param name="threshold" value="error" />
        <param name="file" value="E:/logs/all.sys.log" />
        <param name="maxFileSize" value="10M" />
        <param name="maxBackupIndex" value="5" />
        <!-- 设置是否在从新启动服务时,在原有日志的基础添加新日志 --> 
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%-5p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%c] :%m%n" />
        </layout>
    </appender>

    <!--输出到文件 全部日志,根据name='DatePattern'设置每隔多久分割成一个新文件 -->
    <appender name="fileAppenderAll" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="E:/logs/all.log" />
        <!-- value的格式,(天,小时,分钟), 控制每隔多久分割成一个新文件 -->
        <param name="DatePattern" value=".yyyy-MM-dd-HH" />
        <!-- 设置是否在从新启动服务时,在原有日志的基础添加新日志 --> 
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n" />
        </layout>
    </appender>
    
    <!--输出到错误日志文件,只要加上filter过滤标签便可输出指定级别的日志  -->
    <appender name="fileAppenderError" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="E:/logs/error.log" />
        <param name="DatePattern" value=".yyyy-MM-dd-HH" />
        <param name="Append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n" />
        </layout>
        <!-- 日志级别,必须LevelMin <= LevelMax ,不然不输出日志 -->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="ERROR" />
            <param name="LevelMax" value="ERROR" />
        </filter>
    </appender>
    
    <!-- HTML形式的错误日志,<layout>标签中使用org.apache.log4j.HTMLLayout -->
    <appender name="fileHTMLAppender" class="org.apache.log4j.RollingFileAppender">
        <param name="threshold" value="error" />
        <param name="file" value="E:/logs/all.log.html" />
        <param name="maxFileSize" value="10M" />
        <param name="maxBackupIndex" value="5" />
        <param name="append" value="true" />
        <layout class="org.apache.log4j.HTMLLayout" />
    </appender>

    <!-- XML形式错误日志 <layout>标签中使用org.apache.log4j.xml.XMLLayout -->
    <appender name="fileXMLAppender" class="org.apache.log4j.RollingFileAppender">
        <param name="threshold" value="error" />
        <param name="file" value="E:/logs/all.log.xml" />
        <param name="maxFileSize" value="10M" />
        <param name="maxBackupIndex" value="5" />
        <param name="append" value="true" />
        <layout class="org.apache.log4j.xml.XMLLayout" />
    </appender>
    
    <!-- 邮件日志,添加发送和接收日志的邮箱地址 -->
    <appender name="mailMAILAppender" class="org.apache.log4j.net.SMTPAppender">
        <param name="threshold" value="debug" />
        <param name="BufferSize" value="10" />
        <param name="From" value="1076242265@163.com" />
        <param name="SMTPHost" value="www.baidu.com" />
        <param name="Subject" value="1076242265-log4j-Message" />
        <param name="To" value="1076242265@163.com" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%-5p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%c] :%m%n" />
        </layout>
    </appender>
    
    <!-- SOCKET日志 -->
    <appender name="remoteSocketAppender" class="org.apache.log4j.net.SocketAppender">
        <param name="threshold" value="fatal" />
        <param name="remoteHost" value="localhost" />
        <param name="port" value="18845" />
        <param name="locationInfo" value="true" />
    </appender>
    
    
    <!-- 输出sql日志文件 -->
    <appender name="fileSql" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="E:/logs/sql.log" />
        <param name="DatePattern" value=".yyyy-MM-dd-HH" />
        <param name="Append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n" />
        </layout>
        <!-- 日志级别,必须LevelMin <= LevelMax ,不然不输出日志 -->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG" />
            <param name="LevelMax" value="ERROR" />
        </filter>
    </appender>

    <!-- 指定接口日志,接口1,name能够按接口名进行自定义命名 -->
    <appender name="INTERFACE-METHOD-ONE" class="org.apache.log4j.DailyRollingFileAppender" >
        <param name="DatePattern" value=".yyyy-MM-dd-HH" />
        <param name="Append" value="true"/>
        <param name="file" value="E:/logs/interfaceMethodOne.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="INFO" />
            <param name="LevelMax" value="ERROR" />
        </filter>
    </appender>

    <!-- 指定接口日志,接口2,name能够按接口名进行自定义命名 -->
    <appender name="INTERFACE-METHOD-TWO" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="DatePattern" value=".yyyy-MM-dd-HH" />
        <param name="Append" value="true"/>
        <param name="file" value="E:/logs/interfaceMethodTwo.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%d{yyyy.MM.dd HH:mm:ss SS} %5p [%t] %C{1}.%M(%L) | %m%n"/>
        </layout>
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="INFO" />
            <param name="LevelMax" value="ERROR" />
        </filter>
    </appender>
    
    
    <!-- 指定logger的设置,additivity指示是否叠加输出log,
              若是是false,在INTERFACE-METHOD-ONE-PARTONE logger中日志不会被其它logger知足条件的logger(好比root)输出  
                将名称为INTERFACE-METHOD-ONE-PARTONE的logger,输出到“interfaceMethodOne”的appender
               
               category的属性additivity="false"表示在category中定义日志输在root中过滤掉
               若是不想过滤掉,就设置为true
             所谓logger的名字也就是,在定义Logger时,构造函数的参数   
              Logger log = Logger.getLogger("INTERFACE-METHOD-ONE-PARTONE");
              
                     注意:<logger>和<category>的区别
          logger是category的子类,category如今已经不提倡使用。
    -->  
    <logger name="INTERFACE-METHOD-ONE-PARTONE" additivity="true">  
        <level class="org.apache.log4j.Level" value="DEBUG"/>
        <!-- 指向上面定义的appender中的name,日志则会输出到指定文件中 -->
        <appender-ref ref="INTERFACE-METHOD-ONE"/>  
    </logger>
    
    <category name="INTERFACE-METHOD-TWO-PARTONE" additivity="true">
        <appender-ref ref="INTERFACE-METHOD-TWO"/>
    </category>
    
    <!-- 打印sql文件  -->
    <category name="com.yw.mapper" additivity="true">
        <priority value="DEBUG" />
        <appender-ref ref="fileSql" />
    </category>
    <!-- 
    <category name="org.apache.mybatis">  
        <priority value="DEBUG" />  
        <appender-ref ref="fileSql" />
    </category>
    <category name="org.mybatis.spring">  
        <priority value="DEBUG" />  
        <appender-ref ref="fileSql" />
    </category>
     -->

    <root>
        <priority value="INFO" />
        <appender-ref ref="consoleAppender" />
        <appender-ref ref="fileAppenderAll" />
        <appender-ref ref="fileAppenderError" />
    </root>
</log4j:configuration>

2.二、 log4j.properties 详解


######################
## set log levels 
######################
log4j.rootLogger=DEBUG,CONSOLE,FILEOUT
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
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=[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c] \:%m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n\u00A0
#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
######################
## Rolling File Appender
######################
log4j.appender.FILEOUT=org.apache.log4j.RollingFileAppender
log4j.appender.FILEOUT.File=E:/logs/allError.log
#log4j.appender.FILEOUT.Threshold=ALL
log4j.appender.FILEOUT.Threshold=INFO
log4j.appender.FILEOUT.Append=true
log4j.appender.fileout.MaxFileSize=1000KB
#log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.FILEOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.FILEOUT.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c] \:%m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n\u00A0
#######################
### File Appender
#######################
#log4j.appender.FILE=org.apache.log4j.FileAppender
#log4j.appender.FILE.File=E:/logs/all.log
#log4j.appender.FILE.Append=true
#log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c] \:%m%n
##log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n\u00A0
##################### 
## 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.SOCET.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
#log4j.appender.MAIL.From=openwolfl@163.com
#log4j.appender.MAIL.SMTPHost=mail.openwolf.com
#log4j.appender.MAIL.Subject=Log4J Message
#log4j.appender.MAIL.To=openwolfl@163.com
#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=root
#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
#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
#################### 
### myself 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 = corlin@yeqiangwei.com
#log4j.appender.im.layout=org.apache.log4j.PatternLayout
#log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

三、log4j配置文件自动读取

项目中配置log4j.xml或者log4j.properties文件,不须要配置读取log4j配置文件,程序运行后log4j配置文件会自动起做用,主要由于apache.log4j.java的源码中已经读取了这个配置文件(log4j配置文件必须放在根目录下):


优先读取log4j.xml配置,不存在则会去读取log4j.properties





四、log4j日志使用

两种方式:

public class UserServiceImpl implements UserService {
        //第一种方式,INTERFACE-METHOD-ONE 实在xml中配置的一个日志name
	private static Logger logger1 = Logger.getLogger("INTERFACE-METHOD-ONE");
        //第二种方式:UserServiceImpl.class 是该类的class
        private static Logger logger2 = Logger.getLogger(UserServiceImpl.class);
}