Logger
Log的历史
先简单说说Log的发展史,Log中文翻译为日志,通常指我们程序中由程序编写者打印出的信息,目的主要有调试,信息记录,警告,错误通知。很久很久以前,Apache再次创建了一经典,log4j为Java程序员所广泛使用,随后Sun在JDK1.4也推出了Logging机制,但并未获得认可,Apache随后推出commons-logging,目的似乎是对Sun的反击,通过动态查找机制同时可支持log4j或jdk14的logging。commons-logging+log4j在其后的很长一段时间内成为了Java开发的经典组合,commons-logging也长时间不更新了,Apache的Developer们似乎是丧失了再开发他们的Logging Framework的兴趣。直到最近1年,本地Log领域(更复杂的Log分析领域另有优秀的产品)又有了新的变化,原Log4j的开发者另立门户,开发的新Logback和已被广泛使用的slf4j渐渐在取代commons-logging的地位。它们的优点就是克服了commons-logging的一些缺点,有兴趣的自己去找吧。我们准备使用的是slf4j,它仍然属于对于各种logging lib的一层封装,但使用起来更加方便,并且我们仍然可以用log4j的配置文件来配置它。
Log的规定
使用debug, info, warn, error四个级别,debug为打印调试信息,例如接口参数值,返回结果等,info用来打印有用的信息通知,warn用在发生了某些问题,但并无严重影响(例如影响业务逻辑的实现)的,error用于严重错误,业务逻辑执行失败。
提交的代码中必须使用log来代替System.out.print(ln)和e.printStackTrace()语句,这两种只能在进行出错时特殊化的临时打印。
当出现异常后,使用log打印时,必须使用logger.xxx("message", e)的形式输出。
在所有异常被捕获但没有被重新抛出的地方都必须写日志。
错误的代码段
- 没有捕获特定异常,Exception是不明确的异常;
- 既没有抛出异常,又没写注释;
- debug级别错误,(除非这个异常真的是你想让它出现的,这种情况极少);
- debug的参数是模糊不确切的ex.getMessage();
- 最后返回SUCCESS。
3行代码竟然可以说出5处不合理的地方,糟糕之极的代码!!!
API面对不可知调用者时(例如客户端或另一个小组编写的模块),建议使用日志输出接收的参数名和值。
Log使用实例
很简单,以下从slf4j的站点引用过来两个小例子,大家一看便知:
是否注意到了"{}"?并且不再需要写if (logger.isDebugenabled()),使用的是slf4j的
static final Logger logger = LoggerFactory.getLogger(XXX.class)