隨筆-26  評(píng)論-111  文章-19  trackbacks-0
                  一般情況下,在記錄日志時(shí),只能把通過(guò)API進(jìn)行記錄的信息寫入自定義的日志文件,其余的信息就無(wú)法被寫入了.

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

                例如可以在系統(tǒng)進(jìn)行初始化時(shí)進(jìn)行這樣的操作:

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


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


                現(xiàn)在重定向輸出的問(wèn)題解決了,可以又出現(xiàn)了一個(gè)新的問(wèn)題: 在控制臺(tái)上看不到任何輸出信息,輸出的信息全部被定向到日志文件中.

                 要解決這個(gè)問(wèn)題還需要自己實(shí)現(xiàn)一個(gè)OutputStream,讓OutputStream能同時(shí)寫入多個(gè)輸出.

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

                 通過(guò)實(shí)現(xiàn)自己實(shí)現(xiàn)OutputStream之后,
                在
                     PrintStream printStreamOut = new PrintStream(outputStreamOut);
                     PrintStream printStreamErr = new PrintStream(outputStreamErr);
                中分別把outputStreamOut和outputStreamErr對(duì)象換成自己實(shí)現(xiàn)的OutputStream對(duì)象,這樣就可以實(shí)現(xiàn)在一個(gè)OutputStream對(duì)象中進(jìn)行多個(gè)輸出操作.

                按照以上的思路進(jìn)行的實(shí)現(xiàn),可以完全把控制臺(tái)的所有的輸出寫入到日志文件中,包括System.out.println這樣的輸出.

                         snoics
          posted on 2006-03-03 09:10 snoics 閱讀(3854) 評(píng)論(7)  編輯  收藏 所屬分類: 學(xué)習(xí) . 感悟

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


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

            回復(fù)  更多評(píng)論
            
          # re: 捕獲控制臺(tái)的所有輸出信息 2006-03-05 00:43 | netpirate
          程序中的Exception/Error與Log可以分開處理,前者控制臺(tái)輸出,后者輸出到文件。
          :)  回復(fù)  更多評(píng)論
            
          # re: 捕獲控制臺(tái)的所有輸出信息 2006-03-05 00:44 | netpirate
          程序中的Exception/Error與Log可以分開處理,前者控制臺(tái)輸出,后者輸出到文件。
          :)  回復(fù)  更多評(píng)論
            
          # re: 捕獲控制臺(tái)的所有輸出信息 2006-03-05 15:43 | snoics
          你說(shuō)的都是使用WEB容器的情況下,使用的是容器的支持功能,如果是普通的JAVA應(yīng)用程序,不需要使用容器的情況,這樣的說(shuō)法就行不通了  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 东平县| 昭苏县| 凉城县| 前郭尔| 东平县| 黄龙县| 石台县| 泸西县| 都昌县| 奉化市| 凤凰县| 刚察县| 海林市| 南靖县| 莱阳市| 民县| 德化县| 郁南县| 来凤县| 遂平县| 石楼县| 乌拉特前旗| 胶州市| 开封县| 丰台区| 宾川县| 连城县| 军事| 海南省| 宝应县| 米易县| 麦盖提县| 潢川县| 德钦县| 灌云县| 方城县| 长沙县| 西峡县| 四会市| 蒙阴县| 会昌县|