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

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

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

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

    例如:

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

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

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

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

    例如:

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



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

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

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

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

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

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

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

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

      只有在使用 spring+hibernate+struts2,才會(huì)是獨(dú)立請(qǐng)求用不同的 Action 實(shí)例,這樣的實(shí)例變量對(duì)性能影響我想應(yīng)該也不大。

      基礎(chǔ)框架的日志我們?cè)趯?shí)際的使用中都是只在錯(cuò)誤時(shí)輸出。  回復(fù)  更多評(píng)論   
    • # re: 也說一種普遍錯(cuò)誤使用的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的實(shí)例調(diào)用了foo的日志,LOG輸出的類是ServiceB,而不是ServiceA,但是我們需要分析問題時(shí),需要的是ServiceA,配置文件也是應(yīng)該配在ServiceA上的。
        回復(fù)  更多評(píng)論   
    • # re: 也說一種普遍錯(cuò)誤使用的LOG方式
      3220
      Posted @ 2009-01-05 18:34
      我認(rèn)為spring 的作者使用“private final Log LOG = ...”其中的變量名是全部大寫的,而不使用常見的 log, logger 等等,也許就是因?yàn)樗幌M麘?yīng)用的開發(fā)者重名。沒有人禁止你定義 static 的 logger.

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


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

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


    網(wǎng)站導(dǎo)航:
     
     
    主站蜘蛛池模板: 婷婷综合缴情亚洲狠狠尤物| 亚洲综合在线另类色区奇米| 亚洲精品无AMM毛片| 日韩毛片免费在线观看| 日本高清不卡中文字幕免费| 亚洲AV无码不卡在线播放| 免费人成在线观看69式小视频| 亚洲人成网站免费播放| 亚洲综合久久夜AV | 亚洲精品视频免费在线观看| 国产精品亚洲а∨天堂2021| 亚洲av无码国产精品色午夜字幕| 久久精品免费一区二区喷潮 | 欧亚精品一区三区免费| 色爽黄1000部免费软件下载| 亚洲精品私拍国产福利在线| 国产精品色午夜视频免费看 | 女性自慰aⅴ片高清免费| xxxx日本在线播放免费不卡| 亚洲国产精品xo在线观看| 亚洲成a人在线看天堂无码| 1000部禁片黄的免费看| 成人精品综合免费视频| 亚洲同性男gay网站在线观看| 久久久无码精品亚洲日韩软件| 青娱乐免费视频在线观看| 韩国免费A级毛片久久| 中文无码亚洲精品字幕| 亚洲AV无码国产丝袜在线观看| 可以免费观看的一级毛片| 中文字幕乱码免费视频| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 波多野结衣久久高清免费 | 亚洲欧美综合精品成人导航| 亚洲综合视频在线| 久久久久亚洲AV无码专区网站| 免费看少妇作爱视频| 永久在线免费观看| 成人免费区一区二区三区| 妇女自拍偷自拍亚洲精品| 久久精品国产亚洲AV久|