Java/Kotlin 實現控制檯輸出日誌保存到文件

原文: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)

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章