简单的Logger工具类

简单的基于java.util.logging.logger的工具类,详细内容见注释。


import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import sun.reflect.Reflection;

/*
* @author tl 2011-4-4
*
* 日志工具类,定义了一些常用方法,注释中包含一些建议的使用方式,可以任意修改和使用。
*/

public abstract class LogEnv
{
private static final Level newLevel(String name,int l)
{
return new Level(name,l){};
}
/*
* 习惯了用log4j,java.util.logging定义的Level不习惯,
* 同时也要根据实际需要定义更多的Level
*/
public static final Level ERROR = newLevel("ERROR",950);
public static final Level IO_ERR = newLevel("IO_ERR",850);
public static final Level DEBUG = newLevel("DEBUG",650);
public static final Level DEV = newLevel("DEV",1000);
public static final Level SERVICE_ERR = newLevel("SERVICE_ERR",890);

/*
* 建议的logger定义方式:
* static final Logger logger = LogEnv.getLogger();
* 使用logger以class为单位,不会有太多logger。
* 也不要太吝啬,不同的源文件最好不要共用logger,否则难以定位log信息的输出源文件。
* 不要定义成private,否则在内部类/匿名类里使用logger时编译器会在外部class上多定义一个隐含方法。
*
* 使用了sun.reflect.Reflection这个类,不保证在其他JVM或以后的版本可以使用,
* 但通过Thread.getStackTrace()同样可以获得CallerClass
*/
public static Logger getLogger()
{
return getLogger(Reflection.getCallerClass(2));
}
public static Logger getLogger(String name)
{
return Logger.getLogger(name);
}
public static Logger getLogger(Class<?> cls)
{
return getLogger(cls.getName());
}

/*
* 没有声明异常的方法也可能抛出异常,
* 或者方法没有声明的异常(包括非Runtime的Exception)也可能会抛出
* 必要的地方要捕获这种异常。
*
*/
public static void unexpectedException(Logger logger,Throwable ex)
{
logger.log(ERROR,"Unexpected exception: "+ex,ex);
}


public static void logErr(Logger logger,Throwable ex)
{
logger.log(ERROR,String.valueOf(ex),ex);
}

/*
* 在服务器端会有大量的Socket相关的IO异常,正常运行状态下可以不输出,
* 不要直接吞掉任何异常,必要时应可以输出到日志。
*/
public static void logIOErr(Logger logger,Throwable ex)
{
Level level = (ex instanceof IOException)?IO_ERR:ERROR;
if(logger.isLoggable(level))
logger.log(level,String.valueOf(ex),ex);
}

/*
* 服务器端处理请求时可能会以异常的形式处理应答的错误信息,但很多情况下
* 由于安全或协议限制,返回给客户端的错误信息不会包含异常的堆栈信息,
* 必要时需要在服务器端记录异常的堆栈信息。
*/
public static void logServiceErr(Logger logger,Throwable ex)
{
logger.log(SERVICE_ERR,String.valueOf(ex),ex);
}

/*
* 使用logger尽量不要影响性能,Log的Level在DEBUG以及更低级别的时候
* 要先判断该Level的Log是否被输出。
* if(logger.isLoggable(LogEnv.DEBUG))
* LogEnv.debug(...);
*/
public static void debug(Logger logger,Object msg,Throwable ex)
{
logger.log(DEBUG,String.valueOf(msg),ex);
}

/*
* 仅在开发过程中输出的log,为了进一步减少系统的性能和资源损耗,
* 建议用预编译的方式输出Log
* public static final boolean DEVELOP = true;

* if(DEVELOP) LogEnv.dev(...)
* 开发完成后把DEVELOP设成false,编译器会忽略掉这部分代码。
*/
public static void dev(Logger logger,Object msg,Throwable ex)
{
logger.log(DEV,String.valueOf(msg),ex);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值