Java/Kotlin 实现控制台输出日志保存到文件
2023-02-18 16:36:08 时间
原文: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)
参考
相关文章
- 常见算法合集[java源码+持续更新中...]
- 分布式事务(二)Java事务API(JTA)规范
- 北漂不易,逆风前行[给想在北京工作的java同学们诚恳的建议!]
- Java工程师的生活、读书、技术栈
- 十大基础排序算法[java源码+动静双图解析+性能分析]
- 分享两个免费下载Windows系统镜像
- CSRF-跨站请求伪造-相关知识
- 在VMware上安装Metasploitable2
- SSRF-服务器端请求伪造-相关知识
- RCE-远程命令执行和代码执行漏洞-知识
- 文件包含漏洞-知识点
- 包含漏洞-读写文件以及执行命令
- XXE-XML外部实体注入-知识点
- Ninjutsu_v3_08_2020-安全渗透系统安装
- 单兵渗透工具-Yakit-Windows安装使用
- SpringBoot-快速搭建并快速验证是否可用
- Metasploit-模块介绍
- Kali-登录暴力破解器工具-medusa使用
- PS软件下载及安装Photoshop cc 2018下载链接及安装教程(包括2023版本)
- 顺应时代趋势,CSN的安全可控之路