Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log
日常啰嗦
距离上一次更新博客有一段时间了,主要是因为最近有开发任务,另外,这段时间也在学习docker的相关知识,所以博客就没有继续写了,推荐一本书《Docker技术入门与实战》(第二版),想体验一下docker的朋友可以看一下。
按照计划,第二阶段主要是讲一下项目优化上的一些东西,相关的工具已经在基础篇介绍了一些,所以在本阶段更多的是侧重于代码上,虽然做了一份粗略的计划,但是第一篇该写什么又犯了纠结,刚好有一次编写代码时看到一个方法中含有System.out.print()打印语句,这个方法大家都不陌生,第一份代码应该都是"世界,你好",所以本篇就讲一下System.out.print与Log吧。
原因简述
提到代码优化呢,其实需要注意的有很多个地方,因为一个系统涉及到很多技术,针对每个技术也需要对应的优化方案,因此,这是一件时间跨度长且复杂的工程,所以优化篇的开始呢,就先从最开始的地方讲起,打印语句,可能我们每个人都会在日常编码过程中都存在的一个问题,就是对于程序中的一些输出信息,喜欢使用System.out.print打印到控制台上,而不采用日志记录的方式输出到对应的日志文件。
为什么要讲这个事情呢?因为这个问题其实我也想了挺久的,就是System.out.print和log的区别在哪,区别到底有多大,刚好看到代码里有一些System.out.print代码,所以今天就写了这篇文章。
System.out.print与Log比较
System.out.print的优点:直观、方便。
Log的优点:异步、解耦、灵活、策略多。
提到System.out.print,除了感觉到方便之外,还会想到其他的优点吗?似乎也就这个优点,syso快捷键瞬间就是一条打印语句,很顺手的一件事,除了这个感觉外,似乎也没有其他特别的感受了。
System.out.print和java运行程序运行在同一线程,也就是说,业务程序会等待System.out的动作,导致资源被占用,log4j、logback等日志工具进行调试信息的打印,这类工具是异步线程的,不会使程序处于等待状态。
System.out.print是在控制台输出,只能输出到控制台,功能上线后,总不能一直盯着控制台吧,而且日志文件需要保留,以供日后分析,是需要一套管理规范的,即便使用tomcat服务器,System.out会输出到catalina.out文件,catalina.out文件也不会一直存在,需要定期清空,如果不清空,大文件的读写也是挺影响性能的。说到这里,System.out.print写入的文件只有一个,对于一个文件的读写,这个io肯定会排队写,且System.out.print在当前线程,肯定对性能会有稍微的影响。
程序中充斥着大量的System.out.print打印代码是相当不规范的。
补充说明
当然,说到影响服务器性能,必须是代码中存在大量的System.out.print才会明显的影响,而这个量需要有多大呢?考虑到系统体量、服务器版本、服务器配置这些因素,很难给一个固定的值,而且肯定也有很多人认为小量的不规范代码不会使人察觉的,我也支持这个观点,不过我们也要记得一句话,千里之堤溃于蚁穴,不能因为一件事是小事就选择性忽略掉,对自己要求高一点,写的代码也一定要整洁且正确。
项目由小项目慢慢成长为大项目,对于系统的日志要求肯定也越来越苛刻,后期肯定也要搭建日志系统的,日志信息的采集和分析也肯定是用对应的Log框架及相关的技术去做,比如ELK技术栈,这个时候,再问自己一个问题,在控制台上打印算是什么样的一种感受呢?
针对于日志的灵活性,根据一些日志框架的特点,也可以定制自己的日志规范,日志输出策略、日志存储策略、日志维护策略,想怎么输出怎么输出,想怎么存储怎么存储,非常的灵活。不同团队根据自己团队的特点制定出自己的日志策略,而不是一味的System.out.print打印到控制台上,与此相比,程序中充斥大量的System.out.print语句明显黯然失色。
以上为个人观点。
总结
今天讲这个事情,主要的原因,是因为有一次在查找System.out.print和log的区别时发现讲这个问题的文章比较少,所以自己整理了一下,另外一个方面,是觉得代码规范这个事情还是很重要的,希望大家日常编码工作中注意,并没有其他的意思,因为其实写顺手了,System.out.print确实不好改掉。
这里引用代码整洁之道中的一句话:
“进度可以重订,需求可以修改,团队动态可以修正,但糟糕的代码只是一直腐败发酵,无情的拖着团队的后腿。”
这里所讲的糟糕的代码,不只是不规范的输出语句,也包括了很多其他方面不规范和不整洁的代码,改掉不良习惯,养成良好的编程习惯,共勉。
Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log的更多相关文章
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(二)Log4j讲解与整合
日常啰嗦 上一篇文章主要讲述了一下syso和Log间的一些区别与比较,重点是在项目的日志功能上,因此,承接前文<Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)Sy ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例
日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试>讲了不为和不能两个状态,针对不为,只能自己调整心态了,而对于不能,本文会结合一 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试
日常啰嗦 承接前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例>,已经讲解了dao层和service层的单元测试,还有控制器这层也不能 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(七)图片上传功能
日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合>讲了富文本编辑器UEditor的整合与使用 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化
本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇
优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log Spring+SpringMVC+MyBatis+easyUI整合优化篇 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十四)谈谈写博客的原因和项目优化
阶段总结 又到了优化篇的收尾阶段了,这其实是一篇阶段总结性的文章,今天是4月29号,距离第一次发布博客已经两个月零5天,这两个多月的时间,完成了第一个项目ssm-demo的更新,过程中也写了33篇博客 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)Java语言中System.out.print与Log的比较
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 前言 距离上一次更新博客有一段时间了,主要是因为最近有开发任务,另外 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合
日常啰嗦 本来这一篇和接下来的几篇是打算讲一下JDBC和数据库优化的,但是最近很多朋友加我好友也讨论了一些问题,我发现大家似乎都是拿这个项目作为练手项目,作为脚手架来用的,因此呢,改变了一下思路,JD ...
随机推荐
- Python单元测试PyUnit框架轻度整改
原理 参考:单元测试原理 背景 年后有段时间没写代码了,所以趁着周末找了个python单元测试玩下,测试自己的Android应用.发现PyUnit虽然在单个脚本文件中添加多个测试用例,比如官网提供的方 ...
- IP地址和硬件地址 ARP协议
ip地址使用在网络层以上,是一个逻辑地址,物理地址是数据链路层和物理层使用的 在发送数据的时候,数据是从上层往下层发送的,通过tcp报文->ip数据报->mac数据帧 IP地址放在数据报的 ...
- Codeforces 719B Anatoly and Cockroaches
B. Anatoly and Cockroaches time limit per test:1 second memory limit per test:256 megabytes input:st ...
- mysql常用语法
创建表 create table <表名>( <字段名> 类型(长度) not null primary key auto_increment, **主键 name char ...
- hadoop--安装1.2.1版本
hadoop的安装分为三种方式,第一种单机安装,一般用于调试(其实一般都不用).第二种,伪分布式安装,一般程序员开发会使用这种方式.第三种,分布式安装,在实际环境中应用.今天在这里记下的是第二种,即伪 ...
- linux下php开发环境搭建(nginx+php+mysql)
安装前准备工作 先安装一些必要的类库 yum install -y wget zlib-devel bzip2-devel curl-devel openssl openssl-devel vim ...
- 关于jquery中封装函数如何传递当前元素的问题
需要对页面上一组元素进行ajax操作 <div id="aid"></div> <div id="aid"></div ...
- 解决Ubuntu不能连接xshell
首先,判断Ubuntu是否安装了ssh服务: 1.ps -e |grep ssh 如果服务已经启动,则可以同时看到“ssh-agent”和“sshd”,否则表示没有安装服务,或没有开机启动 2.安装s ...
- 用canvas的arc绘制时钟
在页面上加入canvas标签: <body> <canvas id="c1" width="600px" height="600px ...
- Pro Git CN Plus
Git — The stupid content tracker, 傻瓜内容跟踪器.Linus 是这样给我们介绍 Git 的. Git 是用于 Linux 内核开发的版本控制工具.与常用的版本控制工具 ...