文档章节

批量增加日志打印的java程序

疯狂的兔子
 疯狂的兔子
发布于 2017/03/23 15:47
字数 710
阅读 110
收藏 0

需求:项目里面的日志不能够打印出异常栈

分析:项目里面的异常分为两种异常,一种是业务异常比如登录次数过多,比如密码不对等等,约定这样的异常不用处理。所以我们只需要打印出特征码不太明显的常规异常即可,废话少说直接上代码

public class FileInsertRow {
	public static void main(String args[]) {
		try {
			List<String> list = new ArrayList<String>();
			File pathFiles = new File("D:\\log\\files.text");
			BufferedReader reader = null;
			try {
				String tempString = null;
				reader = new BufferedReader(new FileReader(pathFiles));
				while ((tempString = reader.readLine()) != null) {
					list.add(tempString);
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (reader != null) {
					try {
						reader.close();
					} catch (IOException e1) {
					}
				}
			}
			FileInsertRow test = new FileInsertRow();
			for (String pathName : list) {
				System.out.println("处理完成的文件数"+pathName);
				List<Integer> listNumbers = readFileByLines(pathName);
				File srcFile = new File(pathName);// 首先存在文件,文件内容:1
				if(!listNumbers.isEmpty()){
					System.out.println("驾驶"+pathName);
					test.insertStringInFile(srcFile,listNumbers, "			log.info(\"cause异常信息上:\",e);");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void traverseFolder2(String path,List<String> list) {

        File file = new File(path);
        if (file.exists()) {
            File[] files = file.listFiles();
            if (files.length == 0) {
//                System.out.println("文件夹是空的!");
                return;
            } else {
                for (File file2 : files) {
                    if (file2.isDirectory()) {
//                        System.out.println("文件夹:" + file2.getAbsolutePath());
                        traverseFolder2(file2.getAbsolutePath(),list);
                    } else {
                       	if(file2.getName().endsWith("Module.java")){
                       		list.add(file2.getAbsolutePath());
                    	}
                    }
                }
            }
        } else {
            System.out.println("文件不存在!");
        }
    }
	
	 /**
     * 以行为单位读取文件,常用于读面向行的格式化文件
	 * @throws Exception 
     */
    public static  List<Integer> readFileByLines(String fileName) throws Exception {
    	List<Integer> lineNumbers = new ArrayList<Integer>();
        File file = new File(fileName);
        BufferedReader reader = null;
        try {
            System.out.println("以行为单位读取文件内容,一次读一整行:");
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            int line = 1;
            // 一次读入一行,直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
            	if(tempString.contains("catch")&&tempString.contains("Exception")){
            		//获取括弧里面的字符串
            		int left =tempString.indexOf("(");
            		int right = tempString.indexOf(")");
            		String exinfo = tempString.substring(left+1, right);
//            		System.out.println("***"+exinfo+"****");
            		String[] execptionstrings = exinfo.split(" ");
            		if(execptionstrings[0].equals("Exception")){
            			lineNumbers.add(line);
            		}
            	}
            	line++;
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                	e1.printStackTrace();
                }
            }
        }
        return lineNumbers;
    }
    public void insertStringInFile(File inFile, List<Integer> linenos, String lineToBeInserted) throws Exception {
		// 临时文件
		File outFile = File.createTempFile("name", ".tmp");
		// 输入
		FileInputStream fis = new FileInputStream(inFile);
		BufferedReader in = new BufferedReader(new InputStreamReader(fis));
		// 输出
		FileOutputStream fos = new FileOutputStream(outFile);
		PrintWriter out = new PrintWriter(fos);
		// 保存一行数据
		String thisLine;
		// 行号从1开始
		int i = 1;
		while ((thisLine = in.readLine()) != null) {
			// 如果行号等于目标行,则输出要插入的数据
			for (int lineno : linenos) {
				if (i == (lineno+1) ){
					System.out.println("插入日志"+lineToBeInserted);
					out.println(lineToBeInserted);
				}
			}
			// 输出读取到的数据
			out.println(thisLine);
			// 行号增加
			i++;
		}
		out.flush();
		out.close();
		in.close();
		// 删除原始文件
		inFile.delete();
		// 把临时文件改名为原文件名
		outFile.renameTo(inFile);
		TimeUnit.SECONDS.sleep(10);
	}
}

分为这么几步

1.获取项目当中所有的java文件

2.遍历该文件查看是否包含hot word

3.在下面一行打印出日志即可。

 

精测试,以上代码可行性极高,在写这段代码的时候,也入了不少坑,比如java文件操作的几个类,读写文件的乱码问题等等。有空再写,但是依着我拖延症的毛病,估计是写不上了````

© 著作权归作者所有

疯狂的兔子
粉丝 35
博文 178
码字总数 101541
作品 0
北京
后端工程师
私信 提问
Was(WebSphere)不能正常打印程序日志问题

【was日志配置】 服务器 -- 服务器类型 ——webSphere Appliaction server -- 选择sever -- java和进程管理 -- 进程定义 -- java虚拟机 ,调整“通用JVM参数”。 例如Log4j日志变量名称为:打...

gerry_pang
2014/01/09
2.8K
0
log4jdbc数据库访问日志框架使用

log4jdbc官网地址 http://code.google.com/p/log4jdbc/ https://github.com/arthurblake/log4jdbc 当前最新版本是1.2, 支持JDBC3, JDBC4 log4jdbc是在jdbc层的一个日志框架,可以将占位符与参...

cloud-coder
2015/05/27
3.2K
13
深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/79220184 Java虚拟机性能管理神器 - VisualVM(1) 简介 - JVM轻量级监控分析神器 ...

你的猫大哥
2018/01/31
0
0
OpenRASP v0.31 支持 resin 服务器并解决 JDK 兼容性

OpenRASP v0.31 已发布,OpenRASP 是百度安全推出的一款免费、开源的自适应安全产品 更新如下: 重大变更 Java 版本 在升级前,用户需要手动删除 rasp/conf/rasp-log4j.xml 文件 待应用启动后...

OpenRASP
2018/05/22
495
1
Spring Cloud微服务之 sleuth+zipkin日志聚合

1.简介 (1)什么是服务追踪 Sleuth 在微服务架构中,要完成一个功能,通过Rest请求服务API调用服务来完成,整个调用过程可能会聚合多个后台服务器协同完成。在整个链路上,任何一处调用超时...

编程SHA
03/25
58
0

没有更多内容

加载失败,请刷新页面

加载更多

可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! 导读:InfoQ 发布《2019 中国 Java 发展趋势报告》,反映 Java 在中国发展的独特性,同时也希望大家对 Java 有...

阿里云官方博客
19分钟前
3
0
Spring Boot 2.x基础教程:Swagger静态文档的生成

前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了。如果您还不熟悉这块,可以先阅读: Spring Boot 2.x基础教程...

程序猿DD
23分钟前
3
0
《毅力》读书笔记

1.确信你全身心地投入 2.准备好为目标进行艰难的跋涉 3.通过减少需要使用毅力的情形,为将来的挑战做好准备 4.尽可能具体细致地确定你的目标和实现目标的过程 5.把挑战分解为小而易于管理的小...

lingch
24分钟前
3
0
zk中快速选举FastLeaderElection实现

选举涉及概念 服务器状态 投票 如何选择投票? 协议 选举 如何进行选举? epoch 发送者 接收者 发送队列 接收队列 服务器状态 public enum ServerState { LOOKING,寻找Leader状态,当服务处于...

writeademo
26分钟前
3
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

Linux就该这么学
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部