我是一名后台程序员,接触后台只有一年时间,在这期间一共作过四个项目,分别是:java
因为以前作项目的时候没有好好重视日志,因此致使在开发与维护项目出现了不少问题,如今分享分享个人惨痛经历:程序员
作第一个项目的时候,这个是我第一次开始学习后台时作的第一个项目,使用最原始的 servlet + jsp 技术,当时没有任何经验,没有把系统的需求和实现方式思考清楚就开始动工,作的过程遇到不少问题,但今天的主题不在这些问题上,而是关于日志,当时咱们并无在项目使用日志技术记录日志信息,由于该项目没有进行上线发布,因此后面作完了大部分功能以后就没继续完善和维护,因此没有意识到日志的重要性。
作第二个项目与第三个项目时,这是一个商业项目,因为第一次没有意识到日志的重要性,因此开发时是没有打日志的,等到项目开发完后,咱们须要上线测试,部署到服务器时,发现出现了不少个 bug,但之前咱们找 bug 都是经过调试或者在控制台输出错误信息来查看,部署到服务器上根本调试不了也看不到错误信息,这就致使一直找不到致使出现 bug 的地方。后面在项目添加了,但只是在 servlet 层后面添加一个全局的try catch,再记录错误信息而已,但这并没起多大做用。
作第四个项目时,当时有要打日志的想法,可是因为以前没作过,因此对于要如何打日志根本不理解,应该在什么地方记录日志,应该使用哪一种日志级别。因此最后在项目的时候就随便乱打日志,致使最后输出的日志信息时,也是一团乱。数据库
在基于前面的经历,以为有必要去好好学习如何使用日志机制。服务器
就如我以前所说的,开发之后应用服务时,若是你没有使用日志机制,那么当你将服务部署上去时,系统出 bug 了,由于没有错误信息能够查看,因此你找不到错误出现的地方,这样会不方便测试与维护。使用日志及时记录错误的信息,会更方便咱们定位到错误的地方以及错误的缘由,方便咱们修复系统。并发
日志信息通常有五种级别,分别是:app
DEBUG
DEBUG 级别是最低的级别,通常是为了用于测试应用程序而输出日志信息,它只能用于开发环境与测试环境,不能用于线上环境。异步
INFO
INFO 级别比 DEBUG 级别要高,通常用此级别来记录服务正在开启、从请求接收的信息、响应返回的信息等等jsp
WARN
WARN 级别 比 INFO 级别要高,通常是用于记录客户端与服务端链接丢失,数据库链接丢失、Scoket 链接达到限制等一些表示 server 运行时的状态信息函数
ERROR
ERROR 级别 比 WARN 级别要高,通常是用于记录系统出现错误的异常错误信息,在开发时候,经过记录 ERROR 级别的信息,能够方便地定位到系统出错的地方,从而更方便地修复系统高并发
FATAL
FATAL 级别的信息通常是用于记录很是严重的错误事件信息,该事件可能会致使应用崩溃或者中止
为系统性能考虑,使用 Log4j 注意下列几点:
解析:
注:当配置为异步输出的时候,以上位置信息可能会显示不出来,由于实在另外的一个线程记录的调用信息。此时,咱们可使用下面的方法来获取类名和函数名:
StackTraceElement se = Thread.currentThread().getStackTrace()[2];
String msg = se.getClassName() + "-[" + se.getMethodName() + "] " + errorMessage;
使用异步
要使用异步在于要在配置文件中配置 appender,为何要使用异步来记录日志,前面说过记录日志信息会产生文件 IO,这会影响必定的性能,使用异步能够避免由于须要同步记录日志而产生的等待时间。
为每一个模块设置单独的输出文件
根据模块来区分日志文件,在调试和维护某个模块时,能够更方便。
每次调用前检查 if(logger.isDebugEnabled()) { logger.debug(……) }
前面已说过
日志机制对于开发来讲是很是重要的,它关系到调试与维护,在开发一个项目前期,应该提早部署好日志环境。同时,在开发的过程当中,要想好如何去记录日志信息,要用哪一种级别去记录,权衡性能与维护,选择一种较好的日志实施方案。
本文只是我的观点,若有不一样意,能够说出来你们一块儿讨论讨论。以后再补充一篇使用 slf4j + logback 搭建日志机制的博文。