原文:[Java/Kotlin 实现控制台输出日志保存到文件 | Stars-One的杂货小窝](https://stars-one.site/2022/02/21/java-save-log)
之前开发的几款软件,用户用着的过程中,偶尔会存在报错问题,想保留一份日志出来,之后可由用户发过来,进行问题的排查
由于之前都是使用的
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)
评论区