一般情況下,在記錄日志時(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