读书人

容易的Logger工具类

发布时间: 2012-11-01 11:11:32 作者: rapoo

简单的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);    }}

读书人网 >编程

热点推荐