Spring+Logback的集成總結


現在好像用logback替換了log4j,具體看了一下介紹,感覺比log4j好很多。

logback與log4j的區別如下

http://logback.qos.ch/reasonsToSwitch.html


Logback和log4j是非常相似的,如果你對log4j很熟悉,那對logback很快就會得心應手。下面列了logback相對於log4j的一些優點: 

更快的實現 
Logback的內核重寫了,在一些關鍵執行路徑上性能提升10倍以上。而且logback不僅性能提升了,初始化內存加載也更小了。 

非常充分的測試 
Logback經過了幾年,數不清小時的測試。Logback的測試完全不同級別的。在作者的觀點,這是簡單重要的原因選擇logback而不是log4j。 

Logback-classic非常自然實現了SLF4j 
Logback-classic實現了SLF4j。在使用SLF4j中,你都感覺不到logback-classic。而且因為logback-classic非常自然地實現了SLF4J,所以切換到log4j或者其他,非常容易,只需要提供成另一個jar包就OK,根本不需要去動那些通過SLF4JAPI實現的代碼。 

非常充分的文檔 
官方網站有兩百多頁的文檔。 

自動重新加載配置文件 
當配置文件修改了,Logback-classic能自動重新加載配置文件。掃描過程快且安全,它並不需要另外創建一個掃描線程。這個技術充分保證了應用程序能跑得很歡在JEE環境里面。 

Lilith 
Lilith是log事件的觀察者,和log4j的chainsaw類似。而lilith還能處理大數量的log數據 

謹慎的模式和非常友好的恢復 
在謹慎模式下,多個FileAppender實例跑在多個JVM下,能夠安全地寫道同一個日志文件。RollingFileAppender會有些限制。Logback的FileAppender和它的子類包括RollingFileAppender能夠非常友好地從I/O異常中恢復。 

配置文件可以處理不同的情況 
開發人員經常需要判斷不同的Logback配置文件在不同的環境下(開發,測試,生產)。而這些配置文件僅僅只有一些很小的不同,可以通過,和來實現,這樣一個配置文件就可以適應多個環境。 

Filters(過濾器) 
有些時候,需要診斷一個問題,需要打出日志。在log4j,只有降低日志級別,不過這樣會打出大量的日志,會影響應用性能。在Logback,你可以繼續保持那個日志級別而除掉某種特殊情況,如alice這個用戶登錄,她的日志將打在DEBUG級別而其他用戶可以繼續打在WARN級別。要實現這個功能只需加4行XML配置。可以參考MDCFIlter 

SiftingAppender(一個非常多功能的Appender) 
它可以用來分割日志文件根據任何一個給定的運行參數。如,SiftingAppender能夠區別日志事件跟進用戶的Session,然后每個用戶會有一個日志文件。 

自動壓縮已經打出來的log 
RollingFileAppender在產生新文件的時候,會自動壓縮已經打出來的日志文件。壓縮是個異步過程,所以甚至對於大的日志文件,在壓縮過程中應用不會受任何影響。 

堆棧樹帶有包版本 
Logback在打出堆棧樹日志時,會帶上包的數據。 

自動去除舊的日志文件 
通過設置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory屬性,你可以控制已經產生日志文件的最大數量。如果設置maxHistory為12,那那些log文件超過12個月的都會被自動移除。 

 


 

開始實戰

 

  •  導入依賴的jar包

 

<slf4j.version>1.7.7</slf4j.version>
<logback.version>1.1.7</logback.version>


<!-- *****logback start**** -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
    <scope>compile</scope>
</dependency>
<!-- 是用來把Spring源代碼中大量使用到的commons-logging替換成slf4j,
    只有在添加了這個依賴之后才能看到Spring框架本身打印的日志,否則只能看到開發者自己打印的日志 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
    <scope>compile</scope>
</dependency>
<!-- logback-classic包含了slf4j-api.jar,logback-core.jar及logback-classic.jar -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>${logback.version}</version>
</dependency>
<!-- 是由官方提供的對Spring的支持 -->
<dependency>  
    <groupId>org.logback-extensions</groupId>  
    <artifactId>logback-ext-spring</artifactId>  
    <version>${logback-spring.version}</version>  
</dependency>
<!-- ****logback end**** -->

 

  • web.xml中配置Logback

 

<context-param>  
    <param-name>logbackConfigLocation</param-name>  
    <param-value> classpath:logback.xml</param-value>  
</context-param>

 

  • mybatis-config.xml

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>  
        <setting name="logImpl" value="STDOUT_LOGGING" />
        <!-- <setting name="logPrefix" value="dao."/> --><!-- 所有mapper類名稱變成dao.com.xx.mapper.xx -->   
    </settings>
    <!-- 實體類,簡稱 -設置別名 -->  
    <typeAliases>  
        <typeAlias alias="User" type="com.only.mate.entity.User" />  
    </typeAliases>  
    <!-- 實體接口映射資源 -->  
    <!--  說明:如果xxMapper.xml配置文件放在和xxMapper.java統一目錄下,mappers也可以省略,
        因為org.mybatis.spring.mapper.MapperFactoryBean默認會去查找與xxMapper.java相同目錄和名稱的xxMapper.xml -->  
    <mappers>  
        <mapper resource="com/only/mate/mapper/UserMapper.xml" />  
    </mappers>  
</configuration>

 

 

 

  • 引入Logback.xml配置文件

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true"><!-- debug="true"設置調試模式 -->
    <!-- 控制台輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} 耗時:%r 日志來自:%logger{50} 日志類型: %-5p 日志內容:%m%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="DEFAULT-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${catalina.base}/logs/common-default.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名 -->
            <FileNamePattern>${catalina.base}/logs/common-default-%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天數 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <!-- 按照每天生成日志文件 -->   
    <appender name="INFO-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${catalina.base}/logs/info-log.log</File>  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名 -->
            <FileNamePattern>${catalina.base}/logs/info-log-%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天數 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <!-- 指定某一個包或者某一個類的打印級別以及是否傳入root進行打印 -->
    <!-- addtivity:是否向上級loger傳遞打印信息。默認是true。-->
    <!-- <loger>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個loger。-->
    <!-- name:用來指定受此loger約束的某一個包或者具體的某一個類。-->
    <!-- level:
            用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。
            如果未設置此屬性,那么當前loger將會繼承上級的級別。-->
    <!-- 為所有開頭為dao的類打印sql語句 -->
    <!-- <logger name="dao" level="DEBUG">
        <appender-ref ref="INFO-APPENDER" />
    </logger> -->
    <logger name="com.only.mate" level="DEBUG" additivity="true">
        <appender-ref ref="INFO-APPENDER" />
    </logger>
    <!-- 也是<loger>元素,但是它是根loger。只有一個level屬性,應為已經被命名為"root". -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="DEFAULT-APPENDER"/>
    </root>
</configuration>

 


以上就是Spring+Logback的使用,但是有一個問題一直沒有解決

問題是:Mybatis的sql能在控制台上打印,但是無法寫入文件,網上查找了資料但是都不管用,寫上網上的配置

mybatis-config.xml中加上

<setting name="logPrefix" value="dao."/>

引入Logback.xml配置文件中加上

<logger name="dao" level="DEBUG">
    <appender-ref ref="INFO-APPENDER" />
</logger>

具體可以看下源碼,推薦這篇博客

http://blog.csdn.net/wangnan537/article/details/50069697

其實這樣加前綴的方式和我的寫是一樣的,加了前綴,Mapper類的全限命名dao.com.xx.mapper.xx,然后在Logback.xml中寫一個<logger name="dao" level="DEBUG">就是為所有開頭為dao的類打印sql語句

如果我不采用<setting name="logPrefix" value="dao."/>的方式,那么Mapper類的全限命名com.xx.mapper.xx,而我的<logger name="com.only.mate" level="DEBUG" additivity="true">就指定了為mapper配置了logger了,所以找不到問題!希望有大神為我指點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM