slf4j

  • slf4j : 日志接口
  • log4j : 日志实现
  • slf4j-log4j : 实现slf4j的StaticLoggerBind接口,两者之间的适配器
  • logback-core : 日志基础模块
  • logback-classic : 实现slf4j的StaticLoggerBind接口
  • log4j-over-slf4j: 将log4j的输出到slf4j
  • jcl-over-slf4j : 将jcl的用slf4j输出

log4j

  • log4j.properties

      log4j.rootCategory=INFO,console,logfile
      
      log4j.appender.console=org.apache.log4j.ConsoleAppender
      log4j.appender.console.layout=org.apache.log4j.PatternLayout
      log4j.appender.console.layout.ConversionPattern=%d{MM/dd/yy HH:mm:ss,SSS} [%5p] (%F:%M:%L) %m%n
      
      log4j.appender.logfile=org.apache.log4j.RollingFileAppender
      log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
      log4j.appender.logfile.file=C:\\JudeSheng\\datasource.log
      log4j.appender.logfile.layout.ConversionPattern=%d{MM/dd/yy HH:mm:ss,SSS} [%5p] (%F:%M:%L) %m%n
      log4j.appender.logfile.MaxFileSize=400MB
      log4j.appender.logfile.MaxBackupIndex=10
      log4j.appender.logfile.append=true
    

logback

优点

配置 : logback.xml

  • 加载

    1. LoggerContext默认加载项目根目录下的logback.xml,logback-test.xml,logback.groovy
    2. 注意加载顺序,appender在上面,引用的logger在下面
  • 根节点 configuration

      < configuration scan="true" scanPeriod="60 seconds" debug="false">< /configuration>
    
    1. scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true.
    2. scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟.
    3. debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false
  • < contextName> : configuration子节点

  • < property> : configuration子节点,用来定义变量值的标签,用${}使用

      < configuration scan="true" scanPeriod="60 second" debug="false">  
        <property name="APP_Name" value="myAppName" />   
        <contextName>${APP_Name}</contextName>  
      < /configuration>
    
  • < timestamp> : configuration子节点,遵循Java.txt.SimpleDateFormat的格式

      < timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
    

logger : 定义某些类的日志级别

  • name:用来指定受此logger约束的某一个包或者具体的某一个类。
  • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别
  • additivity:是否向上级logger传递打印信息。默认是true。
  • < appender-ref> : logger子节点,指定输出日志的appender
    1. ref : appender名字
  • < root>: configuration子节点,也是< logger>元素,但是它是name为root的根logger,root是其他logger的上级

appender : 日志输出功能模块,最主要的配置

  • name : appender名称

  • class : appender的功能模块的类

  • < encoder> - < pattern> : appender子节点,格式化日志

    1. ch.qos.logback.classic.encoder.PatternLayoutEncoder

    2. 常用配置: %d{yyyy-MM-dd HH:mm:ss} [%level] - %msg%n

    3. 常用配置: %d{yyyy-MM-dd HH:mm:ss.SSS} [%level] %class:%method:%line- %message%n

    4. http://blog.csdn.net/tengdazhang770960436/article/details/18036721

    5. %class表示print语句所在类

    6. %c表示Logger创建的类,%c{1}表示省略包名

    7. %c和%line合用会产生歧义

    8. 其他

         Logger: %logger
         Class: %class
         File: %file
         Caller: %caller
         Line: %line
         Message: %m
         Method: %M
         Relative: %relative
         Thread: %thread
         Exception: %ex
         xException: %xEx
         nopException: %nopex
         rException: %rEx
         Marker: %marker
         %n
      
    9. encoder 和 layout 在作用上没有本质区别。但是自0.9.19版本之后,极力推荐使用encoder。

  • < filter> : appender子节点,过滤日志,可以有多个

    1. < onMatch>(定义符合条件的行为,比如ACCEPT) / < OnMismatch>(定义不符合条件的行为,比如DENY)
      1. 返回DENY,日志将立即被抛弃不再经过其他过滤器;
      2. 返回NEUTRAL,有序列表里的下个过滤器接着处理日志;
      3. 返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。
    2. LevelFilter : 级别过滤器,根据日志级别进行过滤
      1. ch.qos.logback.classic.filter.LevelFilter
      2. < level>DEBUG
    3. ThresholdFilter : 临界值过滤器,level为info,则过滤掉 TRACE 和 DEBUG 级别的日志
      1. ch.qos.logback.classic.filter.ThresholdFilter
      2. < level>INFO
    4. EvaluatorFilter : 求值过滤器,评估、鉴别日志是否符合指定条件. 需要额外的两个JAR包,commons-compiler.jar和janino.jar
      1. < evaluator>< expression>return message.contains("Exception");< /expression>< /evaluator> : 过滤掉所有日志消息中不包含"Exception"字符串的日志

常用appender

  • ConsoleAppender : 把日志添加到控制台
    1. ch.qos.logback.core.ConsoleAppender
  • FileAppender : 把日志添加到文件
    1. ch.qos.logback.core.FileAppender
    2. < file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
    3. < append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
    4. < prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
  • RollingFileAppender :
    1. ch.qos.logback.core.rolling.RollingFileAppender
    2. < rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
    3. < triggeringPolicy >: 告知 RollingFileAppender 何时激活滚动:
    4. < prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
    5. < file> : 通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。

滚动策略

  • TimeBasedRollingPolicy

    1. class:ch.qos.logback.core.rolling.TimeBasedRollingPolicy
    2. 最常用的滚动策略,它根据时间来制定滚动策略
    3. 既负责滚动也负责根据时间格式触发滚动。比如格式最小单位是天,那么每天滚动一次
    4. < fileNamePattern> : 包含文件名及“%d”转换符,%d”可以包含一个Java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。
    5. < maxHistory> : 保留的归档文件的最大数量,超出数量就删除旧文件,那些为了归档而创建的目录也会被删除。
  • SizeBasedTriggeringPolicy

    1. class:ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy
    2. 负责触发滚动
    3. < maxFileSize> : 默认10MB
  • FixedWindowRollingPolicy

    1. class:ch.qos.logback.core.rolling.FixedWindowRollingPolicy
    2. < minIndex> : 最小序号
    3. < maxIndex> : 最大序号
    4. < fileNamePattern> : 必须包含“%i”, 还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
    5. 通常与SizeBasedTriggeringPolicy合用

其他

<if condition='String.valueOf(System.getProperty("SERVER_ENV")).contains("LOCAL")'>
<then>        
    <include resource="/logging/default_appender.xml" />
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%-30(%d{MMM-dd HH:mm:ss.SSS} [%t]) %-5level %C - %m%n</Pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="default" />
        <appender-ref ref="stdout" />
    </root>
</then>
<else>        
    <include resource="/logging/default_appender.xml" />
    <root level="info">
        <appender-ref ref="default" />
    </root>
</else>
</if>