Java中的日志处理

来源:互联网 发布:龙与地下城 知乎 编辑:程序博客网 时间:2024/05/18 03:54

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)的形式输出。
在所有异常被捕获但没有被重新抛出的地方都必须写日志。

错误的代码段

......} catch (Exception ex) {  log.debug(ex.getMessage());}return SUCCESS;
  1. 没有捕获特定异常,Exception是不明确的异常;
  2. 既没有抛出异常,又没写注释;
  3. debug级别错误,(除非这个异常真的是你想让它出现的,这种情况极少);
  4. debug的参数是模糊不确切的ex.getMessage();
  5. 最后返回SUCCESS。

3行代码竟然可以说出5处不合理的地方,糟糕之极的代码!!!

API面对不可知调用者时(例如客户端或另一个小组编写的模块),建议使用日志输出接收的参数名和值。

Log使用实例

很简单,以下从slf4j的站点引用过来两个小例子,大家一看便知:

import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class HelloWorld {  public static void main(String[] args) {    Logger logger = LoggerFactory.getLogger(HelloWorld.class);    logger.info("Hello World");  }}
import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class Wombat {  private static final Logger logger = LoggerFactory.getLogger(Wombat.class);   Integer t;   Integer oldT;   public void setTemperature(Integer temperature) {     oldT = t;             t = temperature;     logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);     if(temperature.intValue() > 50) {       logger.info("Temperature has risen above 50 degrees.");    }  }}

是否注意到了"{}"?并且不再需要写if (logger.isDebugenabled()),使用的是slf4j的
static final Logger logger = LoggerFactory.getLogger(XXX.class)

0 0