国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

LogBack入門實(shí)踐

馬永翠 / 2666人閱讀

摘要:日志名的從開始,自動遞增就是指拋出的異常,是顯示全部,如果在中寫入數(shù)字,則表示展示多少行重點(diǎn)來了,上邊都是輸出源。

一、簡介

LogBack是一個日志框架,它是Log4j作者Ceki的又一個日志組件。

LogBack,Slf4j,Log4j之間的關(guān)系

slf4j是The Simple Logging Facade for Java的簡稱,是一個簡單日志門面抽象框架,它本身只提供了日志Facade API和一個簡單的日志類實(shí)現(xiàn),一般常配合Log4jLogBackjava.util.logging使用。Slf4j作為應(yīng)用層的Log接入時,程序可以根據(jù)實(shí)際應(yīng)用場景動態(tài)調(diào)整底層的日志實(shí)現(xiàn)框架(Log4j/LogBack/JdkLog...);

LogBack和Log4j都是開源日記工具庫,LogBack是Log4j的改良版本,比Log4j擁有更多的特性,同時也帶來很大性能提升。

LogBack官方建議配合Slf4j使用,這樣可以靈活地替換底層日志框架。

LogBack的結(jié)構(gòu)
LogBack分為3個組件,logback-core, logback-classic 和 logback-access。
其中l(wèi)ogback-core提供了LogBack的核心功能,是另外兩個組件的基礎(chǔ)。
logback-classic則實(shí)現(xiàn)了Slf4j的API,所以當(dāng)想配合Slf4j使用時,則需要引入這個包。
logback-access是為了集成Servlet環(huán)境而準(zhǔn)備的,可提供HTTP-access的日志接口。

Log的行為級別:

OFF
FATAL
ERROR
WARN
INFO
DEBUG
ALL
從下向上,當(dāng)選擇了其中一個級別,則該級別向下的行為是不會被打印出來。
舉個例子,當(dāng)選擇了INFO級別,則INFO以下的行為則不會被打印出來。

二、slf4j與logback結(jié)合使用原理

我們從java代碼最簡單的獲取logger開始

Logger logger = LoggerFactory.getLogger(xxx.class.getName());

LoggerFactory是slf4j的日志工廠,獲取logger方法就來自這里。

public static Logger getLogger(String name) {
    ILoggerFactory iLoggerFactory = getILoggerFactory();
    return iLoggerFactory.getLogger(name);
}

這個方法里面有分為兩個過程。第一個過程是獲取ILoggerFactory,就是真正的日志工廠。第二個過程就是從真正的日志工廠中獲取logger。
第一個過程又分為三個部分。

第一個部分加載org/slf4j/impl/StaticLoggerBinder.class文件

paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);//STATIC_LOGGER_BINDER_PATH = "org/slf4j/impl/StaticLoggerBinder.class"

第二部分隨機(jī)選取一個StaticLoggerBinder.class來創(chuàng)建一個單例
當(dāng)項(xiàng)目中存在多個StaticLoggerBinder.class文件時,運(yùn)行項(xiàng)目會出現(xiàn)以下日志:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/jiangmitiao/.m2/repository/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/jiangmitiao/.m2/repository/org/slf4j/slf4j-log4j12/1.7.12/slf4j-log4j12-1.7.12.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 [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

最后會隨機(jī)選擇一個StaticLoggerBinder.class來創(chuàng)建一個單例

StaticLoggerBinder.getSingleton()

第三部分返回一個ILoggerFactory實(shí)例

StaticLoggerBinder.getSingleton().getLoggerFactory();

所以slf4j與其他實(shí)際的日志框架的集成jar包中,都會含有這樣的一個org/slf4j/impl/StaticLoggerBinder.class類文件,并且提供一個ILoggerFactory的實(shí)現(xiàn)。

第二個過程就是每一個和slf4j集成的日志框架中實(shí)現(xiàn)ILoggerFactory方法getLogger()的實(shí)例所做的事了。

三、slf4j與logback結(jié)合使用實(shí)踐

第一步引入jar包
slf4j-api
logback-core
logback-classic(含有對slf4j的集成包)



    org.slf4j
    slf4j-api
    1.7.12


 
    ch.qos.logback 
    logback-core 
    1.1.3 
 
 
    ch.qos.logback 
    logback-classic 
    1.1.3 

第二步編寫簡單的logback配置文件



  
    
      %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
    
  
            
    
    

文件位置位于src/main/resources下,名字默認(rèn)為logback.xml
當(dāng)然,logback也支持groovy格式的配置文件,如果你會用那更好。
接下來,自己隨便寫一個類調(diào)用一下logger

package log.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * @author jiangmitiao
 * @date 2016/3/24
 * @description TODO
 */
public class Foo {
    public static void doIt(){
        Logger logger = LoggerFactory.getLogger(Foo.class.getName());
        logger.debug("let`s do it");
    }
}

package log.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * @author jiangmitiao
 * @date 2016/3/24
 * @description TODO
 */
public class MyApp1 {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(MyApp1.class.getName());
        logger.info("before");
        Foo.doIt();
        logger.info("after");

        try {
            int i = 10 / 0;
        } catch (Exception e) {
            logger.error("errorTest",e);
        }
    }
}

最后的結(jié)果是:

16:22:13.459 [main] INFO  log.test.MyApp1 - before
16:22:13.463 [main] DEBUG log.test.Foo - let`s do it
16:22:13.463 [main] INFO  log.test.MyApp1 - after
16:22:13.466 [main] ERROR log.test.MyApp1 - errorTest
java.lang.ArithmeticException: / by zero
    at log.test.MyApp1.main(MyApp1.java:19) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_25]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_25]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_25]
    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_25]
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) [idea_rt.jar:na]

這么簡單的配置當(dāng)然是沒有用的,下面這個就能夠說明logback配置文件的編寫規(guī)則了。



    
    myApp1 contextName
    
    

    
    
    
    
    
    
        
        
        
            debug
        

        
        
        
            
            
            
            %-4d [%thread] %highlight%-5level %cyan%logger.%-10method - %message%n
        
    
    
    
    
        
        ${USER_HOME}/myApp1log-${bySecond}.log
        
        
            
            %date %level [%thread] %logger{30} [%file:%line] %msg%n
        
    
    
    
    
        
        
            debug
            ACCEPT
            DENY
        

        
            
            
                %relative%thread%mdc%level%logger%msg
            
        
        ${USER_HOME}/test.html
    

    
    
        
        true
        
        
        
            
            ${USER_HOME}/logFile.%d{yyyy-MM-dd}_%i.log
            
            30
            
            
            
                
                
                10KB
            
        

        
            
            %-4date [%thread] %-5level %logger{35} - %msg%n%ex{full, DISPLAY_EX_EVAL}
        
    

    
    
    
        
        
        
        
    
    
    
        
        
        
    

    
    
    
    
        
    
四、過濾器的一些疑問

Logback的過濾器基于三值邏輯,允許把它們組裝或成鏈,從而組成任意的復(fù)合過濾策略。過濾器很大程度上受到Linux的iptables啟發(fā)。這里的所謂三值邏輯是說,過濾器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一個。
如果返回DENY,那么記錄事件立即被拋棄,不再經(jīng)過剩余過濾器;
如果返回NEUTRAL,那么有序列表里的下一個過濾器會接著處理記錄事件;
如果返回ACCEPT,那么記錄事件被立即處理,不再經(jīng)過剩余過濾器。
寫一個簡單的過濾器大家就明白了。

package log.test;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;

public class SampleFilter extends Filter {
  @Override
  public FilterReply decide(ILoggingEvent event) {    
    if (event.getMessage().contains("let")) {
      return FilterReply.ACCEPT;
    } else {
      return FilterReply.DENY;
    }
  }
}

可以選擇任意幾個輸出源加入這個filter

最后的結(jié)果是,加入該filter的輸出源只能輸出Foo.doIt()中的日志了。

五、總結(jié)

LogBack配置比較簡單,官網(wǎng)手冊也是比較容易看懂的。除上邊幾種輸出源之外,logback還支持輸出到遠(yuǎn)程套接字服務(wù)器、 MySQL、 PostreSQL、Oracle和其他數(shù)據(jù)庫、 JMS和遠(yuǎn)程UNIX Syslog守護(hù)進(jìn)程等等。
第一次學(xué)習(xí)log方面的知識,如有錯誤,請不吝賜教。
相關(guān)資源:
官方手冊
LogBack簡易教程
實(shí)際的xml配置
Logback淺析
logback 配置詳解(一)

更多文章:http://blog.gavinzh.com

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65657.html

相關(guān)文章

  • logback管理日志入門

    摘要:是由創(chuàng)始人設(shè)計(jì)的又一個開源日志組件。此外完整實(shí)現(xiàn)使你可以很方便地更換成其它日志系統(tǒng)如或。訪問模塊與容器集成提供通過來訪問日志的功能。依賴配置的核心,包建議使用來管理日志,方便替換底層實(shí)現(xiàn),要用,就在依賴中加入包和包。 Logback是由log4j創(chuàng)始人設(shè)計(jì)的又一個開源日志組件。logback當(dāng)前分成三個模塊:logback-core,logback-classic和logback-ac...

    bluesky 評論0 收藏0
  • 強(qiáng)推!大牛程序員必備的Java日志框架,性能無敵

    摘要:本文要來分享給大家程序員最常用的日志框架組件。沒有基礎(chǔ)的同學(xué)也不要著急,這套教程覆蓋了目前所有的日志框架,只要你學(xué),就一定用得到,先收藏,以備不時之需。 作為一名Java程序員,我們開發(fā)了很多Java應(yīng)用程序,包括桌面應(yīng)用、WEB應(yīng)用以及移動應(yīng)用。然而日志系統(tǒng)是一個成熟Java應(yīng)用所必不可少的。在開發(fā)和調(diào)試階段,日志可以幫...

    zebrayoung 評論0 收藏0
  • Activiti工作流從入門到入土:入門實(shí)例

    摘要:二環(huán)境準(zhǔn)備編譯器選擇這里我們使用進(jìn)行工作流開發(fā),雖然對于工作流的友好度不是很好,因?yàn)闀幸恍┬〉模牵瑢τ诘拈_發(fā)還是非常的好的。新建后出現(xiàn)下面的編輯頁面到現(xiàn)在,編輯插件就準(zhǔn)備好了。 文章源碼托管:https://github.com/OUYANGSIHA...歡迎 star !!! 一、前言 在上一節(jié)中我們對activiti進(jìn)行了基本的介紹activiti進(jìn)行了基本的介紹,同時介紹了...

    SwordFly 評論0 收藏0
  • 慕課網(wǎng)_《新一代構(gòu)建工具gradle》學(xué)習(xí)總結(jié)

    摘要:時間年月日星期二說明本文部分內(nèi)容均來自慕課網(wǎng)。項(xiàng)目一個項(xiàng)目代表一個正在構(gòu)建的組件比如一個文件,當(dāng)構(gòu)建啟動后,會基于實(shí)例化一個類,并且能夠通過變量使其隱式可用。任務(wù)動作定義了一個最小的工作單元。 時間:2017年05月16日星期二說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無個人學(xué)習(xí)源碼:https://github.com/zccod...

    antyiwei 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<