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
优点
- 可自动重新加载配置文件
- 比log4j高效低耗
- 更强大的功能,更灵活的配置
- http://www.importnew.com/22290.html
配置 : logback.xml
-
加载
- LoggerContext默认加载项目根目录下的logback.xml,logback-test.xml,logback.groovy
- 注意加载顺序,appender在上面,引用的logger在下面
-
根节点 configuration
< configuration scan="true" scanPeriod="60 seconds" debug="false">< /configuration>
- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true.
- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟.
- 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
- ref : appender名字
- < root>: configuration子节点,也是< logger>元素,但是它是name为root的根logger,root是其他logger的上级
appender : 日志输出功能模块,最主要的配置
-
name : appender名称
-
class : appender的功能模块的类
-
< encoder> - < pattern> : appender子节点,格式化日志
-
ch.qos.logback.classic.encoder.PatternLayoutEncoder
-
常用配置: %d{yyyy-MM-dd HH:mm:ss} [%level] - %msg%n
-
常用配置: %d{yyyy-MM-dd HH:mm:ss.SSS} [%level] %class:%method:%line- %message%n
-
http://blog.csdn.net/tengdazhang770960436/article/details/18036721
-
%class表示print语句所在类
-
%c表示Logger创建的类,%c{1}表示省略包名
-
%c和%line合用会产生歧义
-
其他
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
-
encoder 和 layout 在作用上没有本质区别。但是自0.9.19版本之后,极力推荐使用encoder。
-
-
< filter> : appender子节点,过滤日志,可以有多个
- < onMatch>(定义符合条件的行为,比如ACCEPT) / < OnMismatch>(定义不符合条件的行为,比如DENY)
- 返回DENY,日志将立即被抛弃不再经过其他过滤器;
- 返回NEUTRAL,有序列表里的下个过滤器接着处理日志;
- 返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。
- LevelFilter : 级别过滤器,根据日志级别进行过滤
- ch.qos.logback.classic.filter.LevelFilter
- < level>DEBUG
- ThresholdFilter : 临界值过滤器,level为info,则过滤掉 TRACE 和 DEBUG 级别的日志
- ch.qos.logback.classic.filter.ThresholdFilter
- < level>INFO
- EvaluatorFilter : 求值过滤器,评估、鉴别日志是否符合指定条件. 需要额外的两个JAR包,commons-compiler.jar和janino.jar
- < evaluator>< expression>return message.contains("Exception");< /expression>< /evaluator> : 过滤掉所有日志消息中不包含"Exception"字符串的日志
- < onMatch>(定义符合条件的行为,比如ACCEPT) / < OnMismatch>(定义不符合条件的行为,比如DENY)
常用appender
- ConsoleAppender : 把日志添加到控制台
- ch.qos.logback.core.ConsoleAppender
- FileAppender : 把日志添加到文件
- ch.qos.logback.core.FileAppender
- < file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
- < append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
- < prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
- RollingFileAppender :
- ch.qos.logback.core.rolling.RollingFileAppender
- < rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
- < triggeringPolicy >: 告知 RollingFileAppender 何时激活滚动:
- < prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
- < file> : 通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
滚动策略
-
TimeBasedRollingPolicy
- class:ch.qos.logback.core.rolling.TimeBasedRollingPolicy
- 最常用的滚动策略,它根据时间来制定滚动策略
- 既负责滚动也负责根据时间格式触发滚动。比如格式最小单位是天,那么每天滚动一次
- < fileNamePattern> : 包含文件名及“%d”转换符,%d”可以包含一个Java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。
- < maxHistory> : 保留的归档文件的最大数量,超出数量就删除旧文件,那些为了归档而创建的目录也会被删除。
-
SizeBasedTriggeringPolicy
- class:ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy
- 负责触发滚动
- < maxFileSize> : 默认10MB
-
FixedWindowRollingPolicy
- class:ch.qos.logback.core.rolling.FixedWindowRollingPolicy
- < minIndex> : 最小序号
- < maxIndex> : 最大序号
- < fileNamePattern> : 必须包含“%i”, 还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
- 通常与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>