<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    Clojure世界:日志管理——clojure.tools.logging

    Posted on 2012-02-12 20:53 dennis 閱讀(4274) 評(píng)論(4)  編輯  收藏 所屬分類: Clojure

        處理日志是任何一個(gè)產(chǎn)品級(jí)的程序都需要仔細(xì)處理的模塊。在Java中,我們經(jīng)常使用的是log4j就是一個(gè)日志框架。在clojure里,同樣有一套日志框架——clojure.tools.logging,它不僅提供了常用的日志輸出功能,還屏蔽了Java各種日志框架之間的差異,如slf4j,commons-logging,log4j,java.util.logging等,讓你可以透明地使用這些框架來(lái)處理日志。

    名稱:clojure.tools.logging
    主頁(yè):https://github.com/clojure/tools.logging
    依賴:
    [org.clojure/tools.logging "0.2.3"]

    <dependency>
      
    <groupId>org.clojure</groupId>
      
    <artifactId>tools.logging</artifactId>
      
    <version>0.2.3</version>
    </dependency>

    使用:
    (ns example.core
      (:use [clojure.tools.logging :only (info error)]))

    (defn divide [x y]
      (try
        (info "dividing" x "by" y)
        (/ x y)
        (catch Exception ex       (error ex "There was an error in calculation"))))

    常用宏和方法:
    1.除了上面例子的info和error宏,還可以包括warn,trace,debug,fatal等常用宏,分別對(duì)應(yīng)相應(yīng)的日志級(jí)別。這些方法會(huì)自動(dòng)判斷當(dāng)前l(fā)ogger的級(jí)別是否有效,有效的前提下才會(huì)輸出日志。也就是說(shuō)在Java里,你經(jīng)常需要這樣:
    if (logger.isDebugEnabled()) {
        logger.debug(x 
    + " plus " + y + " is " + (x + y));
    }
    在使用 tools.logging的時(shí)候是不需要的,因?yàn)檫@些宏幫你做了這個(gè)判斷。另外,我們?cè)谑褂胠og4j的時(shí)候需要指定log的namespace,在tools.logging里不需要,默認(rèn)會(huì)取當(dāng)前的namespace也就是*ns*。
    最后,info還有個(gè)infof的方法,用于輸出格式化日志:
    (infof "%s is %d years old" "kid" 3)
    日志輸出:
    2012-02-12 20:23:07,394 INFO  log: kid is 3 years old
    其他方法也有類似的如warnf,debugf等。
    2.spy宏,同時(shí)輸出表達(dá)式的form和結(jié)果,例如
    (spy (+1 2))
    輸出日志
    2012-02-12 20:11:47,415 DEBUG log: (+ 1 2)
    => 3

    3.with-logs宏可以在將*out*和*err*流重定向到日志的情況下求值表達(dá)式,例如:
    (with-logs *ns* (prn "hello world"))
    輸出日志:
    2012-02-12 20:17:32,592 INFO  log: "hello world"
    with-logs需要明確指定log-ns,默認(rèn)out的輸出級(jí)別是info,而err的級(jí)別是error,可以指定輸出級(jí)別(with-logs [*ns* :info :error] ......)

    4.事務(wù)中(dosync中)的日志輸出,tools.logging做了特殊處理,默認(rèn)情況下當(dāng)且僅當(dāng)事務(wù)成功提交的時(shí)候并且日志級(jí)別是warn或者info會(huì)通過(guò)agent異步寫入日志。tools.logging定義了一個(gè)全局的agent——*logging-agent*。當(dāng)判斷當(dāng)前是在事務(wù)中調(diào)用log宏,并且日志級(jí)別在集合*tx-agent-levels*內(nèi),就會(huì)在事務(wù)提交成功的時(shí)候?qū)⑷罩景l(fā)送給*logging-agent*異步處理。可以通過(guò)*tx-agent-levels*改變使用agent輸出日志的級(jí)別范圍,默認(rèn)是#{:info :warn}。還可以通過(guò)改變*force*變量來(lái)強(qiáng)制使用direct或者agent的方式輸出日志,*force*可以為:agent或者:direct。
    (binding [*force* :agent]
      (log :info 
    "hello world"))
    這里特別使用了log宏,需要明確指定日志級(jí)別為info。

    5.默認(rèn)日志框架的是從classpath查找的,查找的順序是sl4j,commons-logging,log4j,java.util.logging,找到哪個(gè)可用就用哪個(gè)。如果你的classpath里存在多個(gè)日志框架,如同時(shí)存在sl4j和commons-logging,那么如果你希望強(qiáng)制使用commons-logging,可以通過(guò)改變*logger-factory*變量來(lái)使用:
    (ns example
      (:use [clojure.tools.logging.impl :only [cl
    -factory]]))
    (binding [
    *logger-factory* (cl-factory)]
      (info 
    "hello world"))

    *logger-factory*是dynamic變量,可以通過(guò)binding改變(前面提到的*force*等變量也一樣),如果不希望每次都用binding,而是全局改變,則需要特殊處理:
    (alter-var-root (var *logger-factory*) (constantly (cl-factory)))
    其他logger factory還包括slf4j-factory,log4j-factory,jul-factory。

    6.每個(gè)日志框架的配置跟使用java沒(méi)有什么兩樣,比如你用log4j,就需要在classpath下放置一個(gè)log4j.properties等。如果你希望用編程的方式配置,可以使用clj-logging-config

    轉(zhuǎn)載請(qǐng)注明出處:http://m.tkk7.com/killme2008/archive/2012/02/12/369822.html

    評(píng)論

    # re: Clojure世界:日志管理——clojure.tools.logging  回復(fù)  更多評(píng)論   

    2012-02-13 10:56 by wondery
    又看到博主新文章了,真好。
    想問(wèn)下你平時(shí)用的Clojure開發(fā)環(huán)境和工具是什么?

    # re: Clojure世界:日志管理——clojure.tools.logging[未登錄](méi)  回復(fù)  更多評(píng)論   

    2012-02-13 11:15 by dennis
    @wondery
    我用的是emacs+swank-clojure

    # re: Clojure世界:日志管理——clojure.tools.logging  回復(fù)  更多評(píng)論   

    2012-02-13 13:02 by wondery
    @dennis
    謝謝,再問(wèn)下,你知道維護(hù)Storm項(xiàng)目的那些人都用什么開發(fā)環(huán)境和工具嗎?

    # re: Clojure世界:日志管理——clojure.tools.logging[未登錄](méi)  回復(fù)  更多評(píng)論   

    2012-02-13 13:22 by dennis
    @wondery
    我不知道,我估計(jì)也是emacs
    主站蜘蛛池模板: 国产精品亚洲精品爽爽| 国产成人免费片在线视频观看| 日亚毛片免费乱码不卡一区 | 亚洲伊人色一综合网| 综合亚洲伊人午夜网 | 免费一级做a爰片久久毛片潮喷| 四虎成年永久免费网站| 成全高清在线观看免费| 免费无码国产在线观国内自拍中文字幕 | 久久久久亚洲精品中文字幕| 永久在线毛片免费观看| 在线精品一卡乱码免费| 久久久久久国产精品免费免费男同 | 16女性下面无遮挡免费| 久久国产精品国产自线拍免费| 有色视频在线观看免费高清在线直播| 亚洲国产综合AV在线观看| 亚洲一级免费视频| 亚洲国产超清无码专区| 久久久久亚洲AV无码永不| 久久亚洲国产伦理| 国产AV无码专区亚洲A∨毛片| 亚洲一区二区三区无码影院| 亚洲av片一区二区三区| xvideos亚洲永久网址| 午夜国产大片免费观看| 国产成人在线免费观看| 国产色婷婷精品免费视频| 国产在线观看免费完整版中文版| 日韩精品视频免费网址| 永久免费毛片手机版在线看| 日韩电影免费在线观看视频| 四虎影院免费在线播放| 日韩精品视频免费网址| www亚洲精品少妇裸乳一区二区| 四虎影在线永久免费四虎地址8848aa| 免费无码一区二区三区蜜桃大 | 男男黄GAY片免费网站WWW| 美女视频黄频a免费观看| 日本永久免费a∨在线视频| 一级黄色毛片免费看|