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)
参考
Java/Kotlin 实现控制台输出日志保存到文件的更多相关文章
- 【代码笔记】iOS-将log日志保存到文件
代码: #import "AppDelegate.h" #import "RootViewController.h" @implementation AppDe ...
- iOS - NSLog、UncaughtException日志保存到文件
转:http://blog.csdn.net/marujunyy/article/details/12005767 对于真机,日志没法保存,不好分析问题.所以有必要将日志保存到应用的Docunment ...
- C# log4net 配置及使用详解--日志保存到文件和Access(转)
按语: 最近项目要求选用Access数据库,但日志管理采用log4net,但保存到数据库一直没有成功,后按照如下配置在程序退出时可以成功保存. 开始新建文件应用log4net.dll ,重新编译就报 ...
- logstash自己的日志保存到文件中:log4j2.properties
status = error dest = err name = PropertiesConfig property.filename = /gwlog/data/logstash/logs appe ...
- Java基础知识强化之网络编程笔记10:TCP之客户端读取文本文件服务器控制台输出
1. TCP之客户端读取文本文件服务器控制台输出 (1)客户端:(发送数据到服务端) package cn.itcast_10; import java.io.BufferedReader; impo ...
- Java基础知识强化之集合框架笔记36:List练习之键盘录入多个数据在控制台输出最大值
1. 键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值 分析: • 创建键盘录入数据对象 • 键盘录入多个数据,我们不知道多少个,所以用集合存储 • 以0结束,这个简单,只要键盘 ...
- python将控制台输出保存到文件
python将控制台输出保存到文件 在平时工作中,有时我们需要将控制台输出保存到文件 1.命令行用>覆盖写入和>>追加写入 for i in range(10000): prin ...
- java项目中eclipse控制台输出log4j的信息
最近做的一个hadoop项目中,用MR实现了一个比较复杂的问题,其中的日志信息都是使用的是log4j来处理的.但不知怎么控制台不输出日志信息,只能输出System.out.println()信息,这个 ...
- Java代码工具箱之控制台输出重定向_控制台输出到文件
1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. //自定导入必要库 //然 ...
- Java如何利用for循环在控制台输出正方形对角线图形
1 /* 2 利用循环在控制台输出如下正方形对角线图形 3 * * * * * * * * * * * 4 * * * * 5 * * * * 6 * * * * 7 * * * * 8 * * * ...
随机推荐
- AIX6.1修改时区/修改时间
环境 AIX6.1 修改时间 格式:date -n mmddHHMMYY #mm表示月分,dd表示日期,HH表示小时,MM表示分钟,YY表示年份. 例子:date -n 1204171622 #修 ...
- centos7.9离线安装MongoDB4.4.17
前言 MongoDB 5.0开始要求CPU支持avx指令集,参考https://mp.weixin.qq.com/s/6FFXih1DEZYDFOk1hCu69w 环境 CentOS 7.9.2009 ...
- SP9494 ZSUM - Just Add It 题解
题目传送门 前置知识 快速幂 解法 推式子: \(\begin{aligned} Z_n+Z_{n-1}-2Z_{n-2}&=(Z_n-Z_{n-2})+(Z_{n-1}-Z_{n-2}) \ ...
- 【LGR-153-Div.2】梦熊联盟 8 月月赛 Ⅳ & Cfz Round 1 & 飞熊杯 #1
[LGR-153-Div.2]梦熊联盟 8 月月赛 Ⅳ & Cfz Round 1 & 飞熊杯 #1 \(T1\) luogu P9577 「Cfz Round 1」Dead Cell ...
- 2023年多校联训NOIP层测试2
2023年多校联训NOIP层测试2 爆零了 T1 HDU 4786 Fibonacci Tree \(0pts\) @wangyunbiao: 不可以,总司令 我:不,可以,总司令 @wangyunb ...
- NC16466 [NOIP2015]信息传递
题目链接 题目 题目描述 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为Ti的同学. 游戏开始时, ...
- NC14701 取数游戏2
题目链接 题目 题目描述 给定两个长度为n的整数列A和B,每次你可以从A数列的左端或右端取走一个数.假设第i次取走的数为ax,则第i次取走的数的价值vi=bi⋅ax,现在希望你求出∑vi的最大值. 输 ...
- Java并发编程实例--11.在线程组中处理未检查异常
第8个例子讲了如何在线程中捕捉未检查异常,本例将介绍如何在线程组中处理未检查异常. Task.java package com.dylan.thread.ch1.c11.task; import ja ...
- win32 - PE Executable and section inject
#include <iostream> #include <Windows.h> #include <ShlObj.h> #include <Shlwapi. ...
- timeit测试函数执行时间
def list_append(): l = [] for i in range(5000): l.append(i) def list_insert(): l = [] for i in range ...