slf4j + Logback使用

使用logback轻松管理日志: http://blog.csdn.net/mydeman/article/details/6716925
Logback日志使用详解: http://www.cnblogs.com/davidwang456/p/4448011.html
logback的介绍-配置: http://sunney2010.iteye.com/blog/1404723
slf4j +  Logback详解: http://donald-draper.iteye.com/admin/blogs/2332433
需要的jar
slf4j-api.jar
logback-core.jar
logback-classic.jar
log4j-over-slf4j.jar
jcl104-over-slf4j.jar
janino.jar
测试主类:
package org;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class testLogback {
	private static Logger log = LoggerFactory.getLogger(testSFL4J.class); 
	   public static void main(String[] args) {
		   log.debug("=======test root=========");
		   log.info("========test daily level info=========");
		   log.warn("========test warn=========");
		   log.error("========test error=========");
  }
} 

如果添加Log4j的相关jar包,则控制台输出为:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/lib/slf4j-log4j12-1.7.9.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/lib/logback-classic-0.9.27.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
[DEBUG] 2016-10-23 15:14:08,549 org.testLogback =======test root=========
[INFO ] 2016-10-23 15:14:08,549 org.testLogback ========test daily level info=========
[WARN ] 2016-10-23 15:14:08,549 org.testLogback ========test warn=========
[ERROR] 2016-10-23 15:14:08,549 org.testLogback ========test error=========
从上面信息可以看出,当有多个StaticLoggerBinder实现时,默认为Log4jLoggerFactory,
去除Log4j的相关jar包,控制输出:
15:24:53,431 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
15:24:53,432 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
15:24:53,432 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/F:/Myeclipse/Log/bin/logback.xml]
15:24:53,477 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
15:24:53,494 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
15:24:53,497 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [stdout]
15:24:53,506 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
15:24:53,542 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
15:24:53,543 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [file—debug]
15:24:53,555 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used
15:24:53,555 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern F:/logback/debug.%d{yyyy-MM-dd}.log for the active file
15:24:53,558 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd' from file name pattern 'F:/logback/debug.%d{yyyy-MM-dd}.log'.
15:24:53,558 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
15:24:53,560 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Sun Oct 23 15:24:53 CST 2016
15:24:53,560 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
15:24:53,561 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[file—debug] - Active log file name: F:/logback/debug.2016-10-23.log
15:24:53,561 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[file—debug] - File property is set to [null]
15:24:53,564 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
15:24:53,564 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [file—error]
15:24:53,565 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used
15:24:53,565 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern F:/logback/error.%d{yyyy-MM-dd}.log for the active file
15:24:53,566 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd' from file name pattern 'F:/logback/error.%d{yyyy-MM-dd}.log'.
15:24:53,566 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
15:24:53,566 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Sun Oct 23 15:24:53 CST 2016
15:24:53,566 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
15:24:53,566 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[file—error] - Active log file name: F:/logback/error.2016-10-23.log
15:24:53,566 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[file—error] - File property is set to [null]
15:24:53,566 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
15:24:53,566 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [file-str]
15:24:53,568 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.boolex.JaninoEventEvaluator] for [evaluator] property
15:24:53,910 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used
15:24:53,910 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern F:/logback/contains.%d{yyyy-MM-dd}.log for the active file
15:24:53,910 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd' from file name pattern 'F:/logback/contains.%d{yyyy-MM-dd}.log'.
15:24:53,910 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
15:24:53,910 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Sun Oct 23 15:24:53 CST 2016
15:24:53,910 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
15:24:53,911 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[file-str] - Active log file name: F:/logback/contains.2016-10-23.log
15:24:53,911 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[file-str] - File property is set to [null]
15:24:53,912 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.classic.db.DBAppender]
15:24:53,963 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [db]
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - java.sql.Connection level set to DEBUG
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - java.sql.Statement level set to DEBUG
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.ibatis level set to DEBUG
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.ibatis.common.jdbc.SimpleDataSource level set to DEBUG
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.ibatis.common.jdbc.ScriptRunner level set to DEBUG
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate level set to DEBUG
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - com.danga.MemCached level set to INFO
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - org.springframework.test level set to DEBUG
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - org.apache.struts2 level set to DEBUG
15:24:53,968 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
15:24:53,968 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [stdout] to Logger[ROOT]
15:24:53,970 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [file—debug] to Logger[ROOT]
15:24:53,970 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [file—error] to Logger[ROOT]
15:24:53,970 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [file-str] to Logger[ROOT]
15:24:53,970 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [db] to Logger[ROOT]

2016-10-23 15:24:53,976 [main] DEBUG org.testLogback - =======test root=========
2016-10-23 15:24:53,979 [main] INFO  org.testLogback - ========test daily level info=========
2016-10-23 15:24:53,979 [main] WARN  org.testLogback - ========test warn=========
2016-10-23 15:24:53,979 [main] ERROR org.testLogback - ========test error=========

去F盘logback文件夹下,可以看到相关日志文件
contains.2016-10-23.log
debug.2016-10-23.log
2016-10-23 15:24:53,976 [main] DEBUG org.testLogback - =======test root=========
error.2016-10-23.log
2016-10-23 15:24:53,979 [main] ERROR org.testLogback - ========test error=========
我的logback.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 控制台输出 -->
     <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
             <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
         </encoder>
     </appender>
 
     <!-- 时间滚动输出 level为 DEBUG 日志 -->
     <appender name="file—debug"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>DEBUG</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY </onMismatch>
         </filter>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <FileNamePattern>F:/logback/debug.%d{yyyy-MM-dd}.log</FileNamePattern>
             <MaxHistory>30</MaxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
     <!-- 时间滚动输出 level为 ERROR 日志 -->
     <appender name="file—error"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>ERROR</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY </onMismatch>
         </filter>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <FileNamePattern>F:/logback/error.%d{yyyy-MM-dd}.log</FileNamePattern>
             <MaxHistory>30</MaxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
     <!-- 特定过滤含有某字符串的日志 -->
     <appender name="file-str"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
         <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
             <evaluator>
                 <expression>message.contains("str")</expression>
             </evaluator>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
         </filter>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <FileNamePattern>F:/logback/contains.%d{yyyy-MM-dd}.log
             </FileNamePattern>
             <MaxHistory>30</MaxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
         </encoder>
     </appender>
 
     <!-- 数据库输出 -->
     <appender name="db" class="ch.qos.logback.classic.db.DBAppender">
         <connectionSource
             class="ch.qos.logback.core.db.DriverManagerConnectionSource">
             <driverClass>com.mysql.jdbc.Driver</driverClass>
             <url>jdbc:mysql://localhost:3306/test</url>
             <user>root</user>
             <password>123456</password>
         </connectionSource>
     </appender>
 
     <logger name="java.sql.Connection">
         <level value="DEBUG" />
     </logger>
     <logger name="java.sql.Statement">
         <level value="DEBUG" />
     </logger>
     <logger name="com.ibatis">
         <level value="DEBUG" />
     </logger>
     <logger name="com.ibatis.common.jdbc.SimpleDataSource">
         <level value="DEBUG" />
     </logger>
     <logger name="com.ibatis.common.jdbc.ScriptRunner">
         <level value="DEBUG" />
     </logger>
     <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate">
         <level value="DEBUG" />
     </logger>
     <logger name="com.danga.MemCached">
         <level value="INFO" />
     </logger>
     <logger name="org.springframework.test">
         <level value="DEBUG" />
     </logger>
     <logger name="org.apache.struts2">
         <level value="DEBUG" />
     </logger>
     <root level="DEBUG">
         <appender-ref ref="stdout" />
         <appender-ref ref="file—debug" />
         <appender-ref ref="file—error" />
         <appender-ref ref="file-str" />
         <appender-ref ref="db" />
     </root>
</configuration>

总结:
从上面的测试可以看出logback日志,可以根据日志的类别去,输出到不同的文件,不用log4j那样要输出大于等于Appender日志等级的日志。



猜你喜欢

转载自donald-draper.iteye.com/blog/2332438