笔记——Log4j基础

前言

        记录学习历程,在学习笔记中有描述不正确的地方,欢迎小伙伴们评论指正。

Log4j

        Log4j由Gülcü于2001年发布,后来成为Apache 基金会的顶级项目。在Log4j2和Logback没有发布出来之前,在业界广泛使用。Log4j2是Log4j的升级版,Apache组织推出Log4j2,取代Log4j

概念

        1、公共类Logger:负责处理日志的大部分操作。

        2、公共接口Appender:负责控制日志记录操作的输出。

        3、公共抽象类Layout:负责格式化Appender的输出。

日志级别及级别等级

        Log4j有8种日志级别。按照从低到高的顺序为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF

        All:最低等级的;用于打开所有日志记录。
        Trace:追踪;就是程序推进一下,就可以写个Trace输出,所以Trace会特别多。
        Debug:指出细粒度信息事件对调试应用程序是非常有帮助的。
        Info:消息在粗粒度级别上突出强调应用程序的运行过程。
        Warn:输出警告及Warn以下级别日志。
        Error:输出错误信息日志。
        Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志。
        OFF:最高级别的;用于关闭所有日志记录。

        如果将日志级别设置在某一个级别上,那么比此级别高的日志都能打印出来。一般只使用四种级别,优先级从高到底分别为Error、Warn、Info、Debug。Log4j默认的优先级为Error或Warn,实际上是Error。

配置文件

       Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的。Log4j支持两种配置文件格式,一种是XML格式的文件log4j.xml配置。一种是properties(key=value)文件。

        Spring中选择配置文件的优先级(从先到后)如下:
        1、classpath下的名为log4j-test.json 或者log4j-test.jsn的文件。
        2、classpath下的名为log4j-test.xml的文件。
        3、classpath下名为log4j.json 或者log4j.jsn的文件。
        4、classpath下名为log4j.xml的文件。

log4j.xml完整配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration>
    <!-- 将日志信息输出到控制台 -->
    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
        <!--过滤器设置输出的级别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <!-- 设置日志输出的最小级别 -->
            <param name="levelMin" value="WARN" />
            <!-- 设置日志输出的最大级别 -->
            <param name="levelMax" value="ERROR" />
            <!-- 设置日志输出的xxx,默认是false -->
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>

    <!-- 将日志信息输出到文件,但是当文件的大小达到某个阈值的时候,日志文件会自动回滚 -->
    <appender name="rollingFileAppender" class="org.apache.log4j.RollingFileAppender">
        <!-- 设置日志信息输出文件全路径名 -->
        <param name="File" value="D:/log4j/RollingFileAppender.log" />
        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
        <param name="Append" value="true" />
        <!-- 设置保存备份回滚日志的最大个数 -->
        <param name="MaxBackupIndex" value="10" />
        <!-- 设置当日志文件达到此阈值的时候自动回滚,单位可以是KB,MB,GB,默认单位是KB -->
        <param name="MaxFileSize" value="10KB" />
        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
    </appender>

    <!-- 将日志信息输出到文件,可以配置多久产生一个新的日志信息文件 -->
    <appender name="dailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <!-- 设置日志信息输出文件全路径名 -->
        <param name="File" value="D:/log4j/DailyRollingFileAppender.log" />
        <!-- 设置日志每分钟回滚一次,即产生一个新的日志文件 -->
        <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />
        <!-- 设置日志输出的样式 -->
        <layout class="org.apache.log4j.PatternLayout">
            <!-- 设置日志输出的格式 -->
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%-5p] [method:%l]%n%m%n%n" />
        </layout>
    </appender>
	
	<!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制-->     
    <logger name="com.runway.bssp.activeXdemo" additivity="false">     
        <priority value ="info"/>       
        <appender-ref ref="activexAppender" />       
    </logger>     
     
    <!-- 根logger的设置-->     
    <root>     
        <priority value ="debug"/>     
        <appender-ref ref="consoleAppender"/>     
        <appender-ref ref="rollingFileAppender"/>
        <appender-ref ref="dailyRollingFileAppender"/>        
    </root>
</log4j:configuration>

log4j.properties配置

log4j.rootLogger=INFO,consoleAppender,logfile,MAIL
log4j.addivity.org.apache=true
#ConsoleAppender,控制台输出
#FileAppender,文件日志输出
#SMTPAppender,发邮件输出日志
#SocketAppender,Socket 日志
#NTEventLogAppender,Window NT 日志
#SyslogAppender,
#JMSAppender,
#AsyncAppender,
#NullAppender
#文件输出:RollingFileAppender
#log4j.rootLogger = INFO,logfile
log4j.appender.logfile = org.apache.log4j.RollingFileAppender
log4j.appender.logfile.Threshold = INFO
# 输出以上的 INFO 信息
log4j.appender.logfile.File = INFO_log.html
#保存 log 文件路径
log4j.appender.logfile.Append = true
# 默认为 true,添加到末尾,false 在每次启动时进行覆盖
log4j.appender.logfile.MaxFileSize = 1MB
# 一个 log 文件的大小,超过这个大小就又会生成 1 个日志 # KB ,MB,GB
log4j.appender.logfile.MaxBackupIndex = 3
# 最多保存 3 个文件备份
log4j.appender.logfile.layout = org.apache.log4j.HTMLLayout
# 输出文件的格式
log4j.appender.logfile.layout.LocationInfo = true
#是否显示类名和行数
log4j.appender.logfile.layout.Title=title:\u63d0\u9192\u60a8\uff1a\u7cfb\u7edf\u53d1\u751f\u4e86\u4e25\u91cd\u9519\u8bef
#每天文件的输出:DailyRollingFileAppender
#log4j.rootLogger = INFO,errorlogfile
log4j.appender.errorlogfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorlogfile.Threshold = ERROR
log4j.appender.errorlogfile.File = ../logs/ERROR_log
log4j.appender.errorlogfile.Append = true
#默认为 true,添加到末尾,false 在每次启动时进行覆盖
log4j.appender.errorlogfile.ImmediateFlush = true
#直接输出,不进行缓存
# ' . ' yyyy - MM: 每个月更新一个 log 日志
# ' . ' yyyy - ww: 每个星期更新一个 log 日志
# ' . ' yyyy - MM - dd: 每天更新一个 log 日志
# ' . ' yyyy - MM - dd - a: 每天的午夜和正午更新一个 log 日志
# ' . ' yyyy - MM - dd - HH: 每小时更新一个 log 日志
# ' . ' yyyy - MM - dd - HH - mm: 每分钟更新一个 log 日志
log4j.appender.errorlogfile.DatePattern = ' . ' yyyy - MM - dd ' .log '
#文件名称的格式
log4j.appender.errorlogfile.layout = org.apache.log4j.PatternLayout
log4j.appender.errorlogfile.layout.ConversionPattern =%d %p [ %c] - %m %n %d
#控制台输出:
#log4j.rootLogger = INFO,consoleAppender
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold = ERROR
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern =%d %-5p %m %n
log4j.appender.consoleAppender.ImmediateFlush = true
# 直接输出,不进行缓存
log4j.appender.consoleAppender.Target = System.err
# 默认是 System.out 方式输出
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
 
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
#数据库:JDBCAppender
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL = jdbc:oracle:thin:@ 210.51 . 173.94 : 1521 :YDB
log4j.appender.DATABASE.driver = oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.user = ydbuser
log4j.appender.DATABASE.password = ydbuser
log4j.appender.DATABASE.sql = INSERT INTO A1 (TITLE3) VALUES ( ' %d - %c %-5p %c %x - %m%n' )
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern =% d - % c -%- 4r [ % t] %- 5p % c %x - % m % n

Log4j Appender详解

Log4j中appender是输出文件方式,一般有5中输出方式:
        1、org.apache.log4j.RollingFileAppender:滚动文件,自动记录最新日志。
        2、org.apache.log4j.ConsoleAppender:控制台。
        3、org.apache.log4j.FileAppender:文件
        4、org.apache.log4j.DailyRollingFileAppender:每天产生一个日志文件。
        5、org.apache.log4j.WriterAppender:将日志信息以流的格式发送到任意指定的地方。

Appender常见子节点

1、Console节点用来定义输出到控制台的Appender

        name:Console的属性,用来指定Appender的名称。
        target:Console的属性,SYSTEM_OUT或SYSTEM_ERR,一般只设置默认SYSTEM_OUT。
        PatternLayout:Console的子节点,输出格式。不设置的情况下默认为%m%n

2、File节点用来设置输出指定位置节点的Appender

        name:File的属性,用来指定Appender的名称
        fileName:File的属性,用来指定输出日志的目标文件带全路径的文件名
        PatternLayout:File的子节点,输出格式,不设置情况下默认为%m%n

3、RollingFile节点用来定义超过指定大小自动删除旧的创建新的Appender

        name:RollingFile的属性,指定Appender的名称。
        fileName:RollingFile的属性,指定输出日志的目标文件带全路径的文件名
        filePattern:RollingFile的属性,指定新建日志文件的名称格式
        PatternLayout:RollingFile的子节点,输出格式,不设置的情况下默认%m%n
        DefaultRolloverStrategy:RollingFile的子节点,用来指定同一个文件夹下最多有几个日志文件时,开始删除旧的,创建新的(通过max属性)
        Policies:RollingFile的子节点,指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。
                TimeBasedTriggeringPolicy:Policies的子节点,基于事件的滚动策略
                        interval属性用来指定多久滚动一次,默认1hour
                        modulate=true用来调整时间。表示是否调整时间间隔以使在时间间隔边界发生下一个滚动。例如:假设小时为具体的时间单元,当前时间为上午3点,时间间隔为4(interval=4),第一次发生滚动是在上午4点,接下来是上午8点,接着是中午12点,接着是下午4点等发生。
                SizeBasedTriggeringPolicy:Policies的子节点,基于文件大小的滚动策略,size属性用来定义每个日志文件的大小。
        Filters:RollingFile的子节点,确定日志文件是否被输出。
                有三个值的过滤条件:ACCEPT(接受)、DENY(拒绝)、NEUTRAL(中立)
                在使用单个过滤器的时候,一般使用ACCEPT和DENY这俩个值;但在组合过滤器中,如果用ACCEPT的情况下,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。
                所以,在组合过滤器中,接受使用NEUTRAL,被第一个过滤器接受的日志信息,会继续使用后面的过滤器进行过滤,只有满足所有过滤器的条件,才会把日志信息写入日志文件。

Log4j Logger详解

        log4j中的logger元素定义一个日志输出器,指定logger的设置,additivity指定是否遵循缺省机制,常见的有两种:Root和Logger。

1、Root

        name:定义logger的名称,以便于后文引用。
        additivity:枚举属性,取值为 true 或 false 。默认为 true ,是否继承父Logger属性。
        level:级别,指定Logger的日志级别。8个级别按照从低到高的顺序:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
        appender-ref:root的子节点,用来指定该日志输出到那个appender,用ref指定。

2、Logger

        logger节点用来单独指定日志的形式,比如要为包下的类文件指定不通的日志级别等。

        level:日志输出级别。8个级别按照从低到高的顺序:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
        name:用来指定该Logger所适用的类或类所在包的全路径,继承自Root节点。
        additivity:Logger属性,取值为 true 或 false 。默认为 true ,是否继承父Logger属性。
        appender-ref:logger的子节点,用来指定该日志输出到那个Appender,如果没有指定,就会默认继承自Root。如果指定了,那么就会在指定的Appender,那么会在指定的Appender和Root的Appender中都会输出,此时,可以将 additivity 属性定义为 false (additivity=false)只在自定义的Appender中进行输出。

Log4j additivity属性详解

        Log4j中的additivity属性是一个枚举属性,取值为 true 和 false 。表示子Logger是否继承父Logger,默认情况下 additivity=true,也就是说默认情况下,子Logger会在父Logger的Appender中输出(子Logger继承父Logger的Appender)。若将additivity设置为false,则子Logger只会在自己的Appender中输出,而不会在父Logger的Appender中输出。

Log4j Layout详解

        Log4j中的Layout主要用于数据的格式化,常见的有:HTMLLayout、SimpleLayout、PatternLayout 三种。

1、HTMLLayout

        格式化日志为html表格形式,一般使用较少,html格式如下:

<table cellspacing="0" cellpadding="4" border="1" bordercolor="#224466" width="100%">
    <tr>
        <th>Time</th>
        <th>Thread</th>
        <th>Level</th>
        <th>Category</th>
        <th>Message</th>
    </tr>
    <tr>
        <td>0</td>
        <td title="main thread">main</td>
        <td title="Level">INFO</td>
        <td title="com.open1111.Test category">com.Test</td>
        <td title="Message">普通Info信息</td>
    </tr>
    <tr>
        <td>2</td>
        <td title="main thread">main</td>
        <td title="Level"><font color="#993300"><strong>FATAL</strong></font></td>
        <td title="com.open1111.Test category">com.Test</td>
        <td title="Message">严重错误fatal信息</td>
    </tr>
    <tr>
        <td>3</td>
        <td title="main thread">main</td>
        <td title="Level"><font color="#993300"><strong>ERROR</strong></font></td>
        <td title="com.open1111.Test category">com.Test</td>
        <td title="Message">报错信息</td>
    </tr>
    <tr>
        <td bgcolor="#993300" style="color:White; font-size : xx-small;" colspan="6">java.lang.IllegalArgumentException: 非法参数
<br>&nbsp;&nbsp;&nbsp;&nbsp; at com.Test.main(Test.java:17)
        </td>
    </tr>
</table>

2、SimpleLayout

        简单的日志输出格式化,打印格式为:级别—日志信息(举例:debug—message、info—message)

3、PatternLayout

        最强大的格式化器,可以根据自定义格式输出日志,若没有指定转换格式,就是用默认的转换格式(%m%n)。

  • %c - %c{数字} - 输出日志器的名称。

        例如:日志器的名称为 com.example.test
                那么%c 则输出 com.example.test
                %c{1} 则输出 test
                %c{2} 则输出 example.test
                %c{3} 则输出 com.example.test
                %c{4} 则输出 com.example.test

  • %C - %C{数字} - 输出调用者名称。
  • %d - 输出打印日志的日期时间。
    常用的格式有:%d{DATE}、%d{ABSOLUTE}、%d{HH:mm:ss,SSS}、%d{ddMMyyyy HH:mm:ss,SSS}
  • %n - 换行
  • %m - 日志内容
  • %p - 日志级别
  • %r - 程序启动到现在的毫秒数
  • %t - 当前线程数
  • %l - 同%F%L%C%M
  • %F - Java源文件名
  • %L - Java源文件行数
  • %C - Java类名,%C{1}输出最后一个元素
  • %M - Java方法名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值