java如何将控制台输出日志写入到指定文件中

 更新时间:2024年04月24日 10:55:44   作者:彭先生吖  
这篇文章主要介绍了java如何将控制台输出日志写入到指定文件中问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

java将控制台输出日志写入到指定文件中

设置控制台日志输出方式

/**
 * 控制台日志写入文件
 * @author Mr peng
 *
 */
@Component
public class ConsoleLogWrite extends OutputStream{
	
	//window输出文件路径
	@Value("${consoleLogWrite.windowsUrl}")
	private String consoleLogWriteWindowsUrl;
	//linux输出文件路径
	@Value("${consoleLogWrite.linuxUrl}")
	private String consoleLogWriteLinuxUrl;
	
	private OutputStream oldOutputStream, newOutputStream;
	
	public ConsoleLogWrite() {
		
	}
	
	public ConsoleLogWrite(OutputStream oldOutputStream, OutputStream newOutputStream) {
        this.oldOutputStream = oldOutputStream;
        this.newOutputStream = newOutputStream;
    }
	
	//重写输出流的方式,改为两种,一种控制台输出,一种写入指定文件
	@Override
	public void write(int b) throws IOException {
		oldOutputStream.write(b);
		newOutputStream.write(b);
	}

	//当前bean初始化前调用
	@PostConstruct
	public void writeLogToFile() throws Exception {
		File tmplLogFile = new File(getUploadPath(consoleLogWriteLinuxUrl, consoleLogWriteWindowsUrl));
		//启一个定时线程延迟15分钟后每过30分钟检查文件大小是否超过100M,如果超过则删除重新创建
		ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
		executorService.scheduleWithFixedDelay(new Runnable() {
			@Override
			public void run() {
				try {
					//文件不存在就创建
			        if (!tmplLogFile.exists()) {
			            try {
							tmplLogFile.createNewFile();
						} catch (IOException e) {
							e.printStackTrace();
						}
			        }
					//文件大于100M就删除,重新创建
			        double KB = 1024 * 1024;
			        double MB = KB * 1024;
			        if(tmplLogFile.length() > MB * 100){
			            tmplLogFile.delete();
			        }
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		}, 15, 30, TimeUnit.MINUTES);
		//设置输出模式
        PrintStream oldOutputStream = System.out;
        OutputStream newOutputStream = new FileOutputStream(tmplLogFile);
        ConsoleLogWrite multiOutputStream = new ConsoleLogWrite(oldOutputStream, new PrintStream(newOutputStream));
        System.setOut(new PrintStream(multiOutputStream));
        System.setErr(new PrintStream(multiOutputStream));
	}
	
	/**
     * 根据当前系统返回对应的路径 
     * @param linuxPath
     * @param windowsPath
     * @return
     */
    public static String getUploadPath(String linuxPath, String windowsPath) {
    	if(System.getProperty("os.name").toLowerCase().indexOf("linux") > 0) {
    		return linuxPath;
    	}
    	return windowsPath;
    }
	
}

前端调用接口获取最新日志信息

@RestController
@RequestMapping("/portal")
public class ConsoleLogReadRes extends BaseController{

	//window输出文件路径
	@Value("${consoleLogWrite.windowsUrl}")
	private String consoleLogWriteWindowsUrl;
	//linux输出文件路径
	@Value("${consoleLogWrite.linuxUrl}")
	private String consoleLogWriteLinuxUrl;	
	//记录日志文件最后的大小
	private long lastTimeFileSize = 0; 	

	@GetMapping("/getConsoleLogInfo")
	public BaseResultVO getConsoleLogInfo(){
		
		File tmplLogFile = new File(FileUtils.getUploadPath(consoleLogWriteLinuxUrl, consoleLogWriteWindowsUrl));
        List<String> result = new ArrayList<String>();
		RandomAccessFile randomAccessFile = new RandomAccessFile(tmplLogFile, "rw");
		randomAccessFile.seek(lastTimeFileSize);    //从上次日志文件后开始读取
		while (randomAccessFile.readLine() != null) {
			//将每一行的数据都存入集合中,统一返回
			result.add(new String(randomAccessFile.readLine().getBytes("ISO8859-1")));		
		}
		lastTimeFileSize = randomAccessFile.length();
		return genSuccessResult(result);
		
	}

}

java中自定义日志输出到指定文件

创建一个类,以便调用方法,类名自定义,我这里定义类名是: WrittenLog

1.定义一个固定的路径

private static final String fileXml = "C:/Users/zhangjie/Desktop/loger/loger";

2.定义一个字符串写入的方法

其中有两个参数:

  • 一个是绝对路径(fileXml)
  • 一个是传入的字段串(context)
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
//把参数写入日志文件
    private void logger (String context,String fileXml) throws IOException{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String trace = sdf.format(new Date().getTime());定义一个系统时间
        File file = new File(fileXml);
        if (!file.exists()) {检测是否有logger.TXT文件
            file.mkdir();
        }
        
        String path = file+".txt";
        File writeFile = new File(path);
        if (!writeFile.exists()) {检测是否在该路径下有logger文件夹
            writeFile.createNewFile();
            writeFile = new File(path);
        }
        FileOutputStream fw = new FileOutputStream(writeFile,true);
        Writer out = new OutputStreamWriter(fw,"UTF-8");设置字符集编码格式
        out.write(trace+"----"+context);
        String newFile = System.getProperty("line.separator");
        out.write(newFile);
        out.close();
            fw.flush();
        fw.close();
                下列是xml格式的参数匹配,如果是json格式参数无需下列代码
        Pattern p = Pattern.compile(">(\\s*|\n|\t|\r)<");  
        Matcher m = p.matcher(response);  
        String returnxml = m.replaceAll("><");  
        DocumentBuilderFactory builderFactory =         DocumentBuilderFactory.newInstance();
        Document doc = null;
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        if(returnxml!=null){
            StringReader sr = new StringReader(returnxml);
            InputSource is = new InputSource(sr);
            doc = builder.parse(is);
        }else{
            throw new Exception("没有收款单数据传入!");
        }
    }

3.创建实例,调用方法

WrittenLog write = new WrittenLog();
write.logger(context,fileXml);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 阿里云主机上安装jdk 某库出现问题的解决方法

    阿里云主机上安装jdk 某库出现问题的解决方法

    今天安装jdk到阿里云服务上,首先看下阿里云是32位还是64位的,如果是32位下载32位的包,如果是64位的下载64位的包,下面与大家分享下安装过程中遇到问题的解决方法
    2013-06-06
  • IDEA报错:java:无效的源发行版21解决方式

    IDEA报错:java:无效的源发行版21解决方式

    这篇文章主要给大家介绍了关于IDEA报错:java:无效的源发行版21的解决方式,这个错误是因为你的项目使用的Java版本与你的IDEA使用的Java版本不一致导致的,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • idea生成WebServices接口的完整流程步骤

    idea生成WebServices接口的完整流程步骤

    因为工作需要,数据传输部分需要使用webservice实现,经过两天的研究,实现了一个简单的例子,这篇文章主要给大家介绍了关于idea生成WebServices接口的完整流程步骤,需要的朋友可以参考下
    2024-08-08
  • SpringBoot启动时加载指定方法的方式小结

    SpringBoot启动时加载指定方法的方式小结

    本文主要给大家介绍了Spring Boot项目启动时加载指定方法都有哪些方式的,文中给大家介绍了五种常用的方式,有详细的代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • JAVA编程实现随机生成指定长度的密码功能【大小写和数字组合】

    JAVA编程实现随机生成指定长度的密码功能【大小写和数字组合】

    这篇文章主要介绍了JAVA编程实现随机生成指定长度的密码功能,可生成带有大小写和数字组合的随机字符串,需要的朋友可以参考下
    2017-07-07
  • Java 中synchronize函数的实例详解

    Java 中synchronize函数的实例详解

    这篇文章主要介绍了Java 中synchronize函数的实例详解的相关资料,希望通过本文能帮助到大家理解使用synchronize函数的使用方法,需要的朋友可以参考下
    2017-09-09
  • Javascript和Java语言有什么关系?两种语言间的异同比较

    Javascript和Java语言有什么关系?两种语言间的异同比较

    虽然Javascript与Java有紧密的联系,但却是两个公司开发的不同的两个产品。那么js和java有什么关系,两种语言的不同点是什么呢?介于这两个问题,小编一起给大家解答下
    2016-09-09
  • Java日常练习题,每天进步一点点(27)

    Java日常练习题,每天进步一点点(27)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Spring AspectJ AOP框架注解原理解析

    Spring AspectJ AOP框架注解原理解析

    这篇文章主要介绍了Spring AspectJ AOP框架注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java中的Random()函数及两种构造方法

    Java中的Random()函数及两种构造方法

    Java中存在着两种Random函数分别是java.lang.Math.Random和java.util.Random,文中给大家介绍了random()的两种构造方法,感兴趣的朋友跟随小编一起看看吧
    2018-11-11

最新评论