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

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

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

    現在很多開源項目在使用LOG的時候做了不好的示范--在基類中實例化的方式使用LOG,而不是靜態(tài)變量。

    例如:

    class Base  {
         private final Log LOG = LogFactory.getLog(this.getClass());
    }

    class Derived  {
        public void foo() {
               if (LOG.isDebugEnabled()) LOG.debug("foo");
        }
    }

    這種用法,當類被繼承的時候,LOG就完全亂了。spring、struts都有這樣的問題。

    正確的使用方式應該是直接靜態(tài)化聲明LOG。

    例如:

    class DerivedA  {
         private final static Log LOG = LogFactory.getLog(DerivedA.class);
    }



    --------------------------
    盛大招聘.Net開發(fā)工程師
    經典好書:.NET框架程序設計(修訂版)
    新聞:2008年最精彩科技圖片:電流運動模擬圖居首
    導航:博客園首頁  知識庫  新聞  招聘  社區(qū)  小組  博問  網摘  找找看
    文章來源:http://www.cnblogs.com/jobs/archive/2009/01/05/1368894.html
    posted on 2009-01-05 10:49 溫少的日志 閱讀(2472) 評論(13)  編輯  收藏
    Comments
    • # re: 也說一種普遍錯誤使用的LOG方式
      seewood
      Posted @ 2009-01-05 11:38
      不同以上的說法,我認為并不存在孰優(yōu)孰劣。一、我認為應該看被聲明Log實例的對象在應用中的作用,很多項目將其作為非靜態(tài)變量聲明,是因為log所在的類是一個Service,在ServerSide只會被實例化一次,那么使用非靜態(tài)的實例,就并不比靜態(tài)來的更耗。二在需要繼承的時候,使用非靜態(tài)就更簡單,子類的this.getClass()得到子類的類型,就自動與父類的log區(qū)別開了。基于這兩個理由,我覺得在使用協(xié)作類的時候,使用實例方式聲明更優(yōu);而在實例類中使用時,使用靜態(tài)方式聲明更優(yōu)。  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      溫少的日志
      Posted @ 2009-01-05 11:47
      @seewood
      不是因為性能的問題,是因為繼承時會導致LOG錯亂,例如你繼承了Spring的ClassPathXmlApplicationContext時,日志輸出的的類名不對了。  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      隔葉黃鶯
      Posted @ 2009-01-05 11:53
      從哪里輸出日志,當然類名就是它了,而不應該是基類,所以用 private final Log LOG = LogFactory.getLog(this.getClass());

      如果是寫成 private final static Log LOG = LogFactory.getLog(DerivedA.class);

      的話,那么類層次中的每一個類,都要聲明一個靜態(tài)的 LOG,好像也很少有人會用全大寫的 LOG 命名。  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      溫少的日志
      Posted @ 2009-01-05 12:23
      @隔葉黃鶯
      你的說法不對,例如LOG4J能夠把記錄日志的類和代碼行數輸出,如果使用
      protected final Log LOG = LogFactory.getLog(this.getClass())的方式,就會導致不能夠簡單的方式定位問題了。

      使用全大寫的方式挺好的,最初在JXTA中看到這種用法,反復比較之后,覺得使用大寫LOG比小寫logger更清晰。  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      3220
      Posted @ 2009-01-05 12:35
      1)我覺得還是需要分析性能的,例如在 spring+hibernate+struts2的框架下,對應一個jsp請求,需要創(chuàng)建的實例非常多,因此一個沒有開發(fā)的很好的Log的實例的創(chuàng)建很有可能因為多次創(chuàng)建而影響性能。

      2) 使用 final Log log的形式確實會造成日志的記錄層次混亂,尤其是Service層。

      因此,我們需要在不同的場景下使用不同的方式,不能千篇一律,例如spring,struts等不能說是使用不當,我覺得在基礎框架層的代碼中需要更多的考慮性能,而且我們基本不會對框架的日志進行過細的分類過濾處理。
      (我覺得日志的分類主要是應用在過濾分類中,具體你需要了解哪一個類出現問題了,一般日志紀錄的格式中都可以標明文件名、行號,因此不需要做過細的過濾分類定義的時候完全可以使用基類的名字)  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      溫少的日志
      Posted @ 2009-01-05 14:35
      @3220
      性能這兩種方式是非常接近的,而且static聲明的方式性能會更好,實例化的方式更方便,struts、spring都采用了更方便的做法,但是更方便的做法,就會在類被繼承的時候導致LOG輸出混亂。像struts、spring框架的類通常不會被繼承,但總是存在一些情況需要繼承的,一旦出現繼承框架的類,例如你編寫一個類繼承自ClassPathXmlApplicationContext,那么LOG輸出就會產生混亂的。

      綜合比較:
      方式A 基類實例化Log LOG = LogFactory.getLog(this.getClass())
      方式B 每個類單獨聲明 static Log LOG = LogFactory.getLog(XXX.class)
      性能 兩種方式接近
      方便 方式A更方便,不需要再子類中再聲明。
      不良后果 在類被繼承時,使用方式A會導致日志輸出混亂  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      隔葉黃鶯
      Posted @ 2009-01-05 14:38
      @溫少的日志
      不太清楚在什么時候,用LogFactory.getLog(this.getClass())不能正確輸出行號和方法

      @3220
      如果是spring+hibernate+struts1 的應用,因為 Service/Dao/Action 類都基本是表現為單例,所以性能上與用靜態(tài)的 log 無甚差異。

      只有在使用 spring+hibernate+struts2,才會是獨立請求用不同的 Action 實例,這樣的實例變量對性能影響我想應該也不大。

      基礎框架的日志我們在實際的使用中都是只在錯誤時輸出。  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      溫少的日志
      Posted @ 2009-01-05 14:47
      @隔葉黃鶯
      例如:
      Class Service {
      protected final LogFactory.getLog(this.getClass());
      }

      Class ServiceA extends Service {
      public void foo("foo");
      }

      Class ServiceB extends ServiceA{
      public void bar("bar");
      }

      這種情況,如果ServiceB的實例調用了foo的日志,LOG輸出的類是ServiceB,而不是ServiceA,但是我們需要分析問題時,需要的是ServiceA,配置文件也是應該配在ServiceA上的。
        回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      3220
      Posted @ 2009-01-05 18:34
      我認為spring 的作者使用“private final Log LOG = ...”其中的變量名是全部大寫的,而不使用常見的 log, logger 等等,也許就是因為他不希望應用的開發(fā)者重名。沒有人禁止你定義 static 的 logger.

      純粹感覺:只要加了 final ,編譯器便可以進行更多優(yōu)化。
      純粹感覺:spring是久經考驗的框架,他這樣用也許有我們還沒有考慮到的問題。


        回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      隔葉黃鶯
      Posted @ 2009-01-06 08:39
      @溫少的日志
      看看你的 log4j.properties 中的
      layout.ConversionPattern
      是怎么寫的,看能否有所改進?  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      溫少的日志
      Posted @ 2009-01-06 11:28
      @隔葉黃鶯
      log4j.properties文件中,layout.ConversionPattern一般都是%c或者%c{1}來顯示類名,你還能怎么配?  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      3220
      Posted @ 2009-01-06 14:42
      log4j 還可以配置 %F:文件名,%L 行號  回復  更多評論   
    • # re: 也說一種普遍錯誤使用的LOG方式
      溫少的日志
      Posted @ 2009-01-06 15:37
      @3220
      使用%F解決了輸出格式問題,但是LOG Leval的配置還是按照類別來區(qū)分,問題還是依然存在的。  回復  更多評論   

    只有注冊用戶登錄后才能發(fā)表評論。


    網站導航:
     
     
    主站蜘蛛池模板: 亚洲高清专区日韩精品| 亚洲一区精品视频在线| 久久久免费的精品| 亚洲免费在线视频播放| 四虎永久在线精品视频免费观看| 插鸡网站在线播放免费观看| 亚洲第一永久在线观看| xvideos亚洲永久网址| 免费无码毛片一区二区APP| 亚洲Aⅴ在线无码播放毛片一线天| 国产亚洲精品看片在线观看 | 在线看免费观看AV深夜影院| 精品一区二区三区免费毛片| 亚洲AV日韩AV天堂久久| 成人免费视频国产| 久久国产精品一区免费下载| jiz zz在亚洲| 亚洲成A∨人片在线观看不卡| 免费无码又爽又刺激高潮 | 国产精品成人免费视频网站京东 | 欧美在线看片A免费观看| 一道本不卡免费视频| 亚洲欧洲日本国产| 国产亚洲色婷婷久久99精品91| www.黄色免费网站| 国产亚洲免费的视频看| 国产成人 亚洲欧洲| 亚洲春黄在线观看| 国产亚洲一区二区三区在线| 日韩免费电影在线观看| **aaaaa毛片免费同男同女| GOGOGO高清免费看韩国| 精品亚洲福利一区二区| 亚洲AV无码专区在线亚| 久久亚洲AV午夜福利精品一区| 亚洲黄片毛片在线观看| 免费看少妇作爱视频| 免费精品国产自产拍在线观看图片 | 亚洲乱码日产精品一二三| 亚洲高清日韩精品第一区| 国产精品亚洲а∨无码播放|