原文:Java/Kotlin 實現控制台輸出日志保存到文件 | Stars-One的雜貨小窩
之前開發的幾款軟件,用戶用着的過程中,偶爾會存在報錯問題,想保留一份日志出來,之后可由用戶發過來,進行問題的排查
由於之前都是使用的
System.out.println()
進行輸出,自己又是懶人一個,不想一個個地方的去改,於是就有了下面的研究
本文較短,主要是總結一下
涉及知識:
- IO流
- Kotlin
方法
網上搜集的方法無非兩種,一種是使用日志框架,第二種則是將控制台默認的輸出流量設置為我們自定義的文件輸出流
1.使用日志框架
比如說logback,可以通過xml配置進行輸出日志的過濾,及將日志保存在文件中
但這種方法經過實際測試,無法直接把我個人寫的那些輸出語句保存在文件中,但之前在某Java交流群中,某位大佬卻說是可以
嘗試一番,發現確實是無用,必須要使用框架提供的logger對象來輸出對應的日志,日志文件才可以捕獲到輸出的日志
與我期望的不符合,此方案拋棄
2.設置系統輸出流
第二種則是把控制台輸出流設置成我們自定義的文件輸出流
//FileOutputStream輸出流的使用方法這里不再贅述了
val fileOs = FileOutputStream("xx.log")
val printStream = PrintStream(fileOs)
System.setOut(printStream)
上面的這個可以實現結果,但是這樣設置了,控制台就不會有輸出了。。
於是怎么辦呢?看到大神的說的,可以采用數據流的分發流(TeeOutputStream)
將輸出流分為兩份輸出,一份對應原來的控制台輸出,一份對應文件流的輸出
TeeTeeOutputStream
此類是屬於common-io
庫中的類,使用前需要引入common-io
的庫
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
val fos = FileOutputStream("xx.log")
val myOut = TeeOutputStream(System.out, fos)
val ps = PrintStream(myOut, true) //true - auto-flush after println
System.setOut(ps)
當然,上面只是設置了平常的輸出流,我們還要設置一下錯誤輸出流(文件輸出流保持一個,控制台的輸出日志和錯誤日志都保存在同一個文件中)
val fos = FileOutputStream("xx.log")
val myOut = TeeOutputStream(System.err, fos)
val ps = PrintStream(myOut, true)
System.setErr(ps)