隨筆-26  評論-111  文章-19  trackbacks-0
                  一般情況下,在記錄日志時,只能把通過API進行記錄的信息寫入自定義的日志文件,其余的信息就無法被寫入了.

                 解決的辦法就是重寫System.out和System.err,讓System.out,System.err的寫入轉向到你的日志文件,這樣只要在控制臺的所有的輸出信息都會被記錄到日志文件中.

                例如可以在系統進行初始化時進行這樣的操作:

                重寫System.out:
                        PrintStream printStreamOut = new PrintStream(outputStreamOut);
                        System.setOut(printStreamOut);
               
                重寫System.err
                        PrintStream printStreamErr = new PrintStream(outputStreamErr);
                        System.setErr(printStreamErr);


                這里的outputStreamOut,和outputStreamErr都是自定義的重定向的日志文件的OutputStream


                現在重定向輸出的問題解決了,可以又出現了一個新的問題: 在控制臺上看不到任何輸出信息,輸出的信息全部被定向到日志文件中.

                 要解決這個問題還需要自己實現一個OutputStream,讓OutputStream能同時寫入多個輸出.

                 首先繼承java.io.OutputStream,然后實現public abstract void write(int b) throws IOException; 并且覆寫java.io.OutputStream中的其他的方法,具體的實現方式按照自己的需求來做,這里就不做出具體的實現了.

                 通過實現自己實現OutputStream之后,
                在
                     PrintStream printStreamOut = new PrintStream(outputStreamOut);
                     PrintStream printStreamErr = new PrintStream(outputStreamErr);
                中分別把outputStreamOut和outputStreamErr對象換成自己實現的OutputStream對象,這樣就可以實現在一個OutputStream對象中進行多個輸出操作.

                按照以上的思路進行的實現,可以完全把控制臺的所有的輸出寫入到日志文件中,包括System.out.println這樣的輸出.

                         snoics
          posted on 2006-03-03 09:10 snoics 閱讀(3853) 評論(7)  編輯  收藏 所屬分類: 學習 . 感悟

          評論:
          # re: 捕獲控制臺的所有輸出信息 2006-03-03 09:46 | 乾為天
          為什么不用log4j?  回復  更多評論
            
          # re: 捕獲控制臺的所有輸出信息 2006-03-03 09:51 | snoics
          用log4j也只能寫入通過log4j的api進行記錄的日志
          如果在程序中有這樣一段Integer.parseInt("jfdklsjfdkf");
          而且沒有去catch這個錯誤,并且用log4j去寫入日志,則這段的出錯信息是不會被寫入日志的,只會在控制太輸出,除非程序是用容器執行,而且是類似jboss這樣的,才會被記錄到jboss自己的系統日志里面  回復  更多評論
            
          # re: 捕獲控制臺的所有輸出信息 2006-03-03 10:14 | snoics
          偏題了吧......這里說的不是該用哪種日志的問題,而且這個思路和log4j并不沖突,甚至可以說是一種補充的方式,可以把log4j捕捉不到的輸出信息也都給記錄下來  回復  更多評論
            
          # re: 捕獲控制臺的所有輸出信息 2006-03-03 15:40 | lizongbo
          tomcat通過配置 context的 swallowOutput="true" 就可以將 system.out和err的輸出轉到servlet的logger中,不過還沒讀過tomcat相關的src,有空可以看看它是怎么做的:)


          http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/org/apache/catalina/Context.html#setSwallowOutput(boolean)

            回復  更多評論
            
          # re: 捕獲控制臺的所有輸出信息 2006-03-05 00:43 | netpirate
          程序中的Exception/Error與Log可以分開處理,前者控制臺輸出,后者輸出到文件。
          :)  回復  更多評論
            
          # re: 捕獲控制臺的所有輸出信息 2006-03-05 00:44 | netpirate
          程序中的Exception/Error與Log可以分開處理,前者控制臺輸出,后者輸出到文件。
          :)  回復  更多評論
            
          # re: 捕獲控制臺的所有輸出信息 2006-03-05 15:43 | snoics
          你說的都是使用WEB容器的情況下,使用的是容器的支持功能,如果是普通的JAVA應用程序,不需要使用容器的情況,這樣的說法就行不通了  回復  更多評論
            
          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(20)

          隨筆分類(8)

          隨筆檔案(26)

          文章分類(18)

          文章檔案(19)

          收藏夾

          Space

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 95917
          • 排名 - 605

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 东安县| 隆化县| 新安县| 泰来县| 巴楚县| 公安县| 襄垣县| 珠海市| 永兴县| 嵩明县| 双城市| 威远县| 赤城县| 广德县| 仪征市| 吴川市| 茶陵县| 乐安县| 那曲县| 汶川县| 会同县| 通州市| 佛坪县| 威远县| 德兴市| 天镇县| 白朗县| 枝江市| 任丘市| 林州市| 怀柔区| 辉县市| 通州区| 宿迁市| 鲁甸县| 故城县| 荔浦县| 云龙县| 五家渠市| 调兵山市| 桂东县|