zoukankan      html  css  js  c++  java
  • log4j的终极封装

    通用型(再也不用每个类new一个logger了)

    public class Log {
        
        private static Map<String,Logger> loggerMap = new HashMap<String,Logger>();
    
        public static void main(String[] args) throws ClassNotFoundException {
            Log.error("自定义LOG","sss444444");
        }
        
        public static void debug(Object message){
            String className = getClassName();
            Logger log = getLogger(className);
            if(log.isDebugEnabled()){
                log.debug(message);
            }
        }
        
        public static void debug(String tag, Object message){
            String className = getClassName();
            Logger log = getLogger(className);
            if(log.isDebugEnabled()){
                log.debug(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
            }
        }
    
        public static void info(Object message){
            String className = getClassName();
            Logger log = getLogger(className);
            if(log.isInfoEnabled()){
                log.info(message);
            }
        }
        
        public static void info(String tag, Object message){
            String className = getClassName();
            Logger log = getLogger(className);
            if(log.isInfoEnabled()){
                log.info(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
            }
        }
        
        public static void warn(Object message){
            String className = getClassName();
            Logger log = getLogger(className);
            log.warn(message);
        }
        
        public static void warn(String tag, Object message){
            String className = getClassName();
            Logger log = getLogger(className);
            log.warn(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
        }
        
        public static void error(Object message){
            String className = getClassName();
            Logger log = getLogger(className);
            log.error(message);
        }
        
        public static void error(String tag, Object message){
            String className = getClassName();
            Logger log = getLogger(className);
            log.error(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
        }
        
        /**
         * 获取最开始的调用者所在类
         * @return
         */
        private static String getClassName(){
            Throwable th = new Throwable();
            StackTraceElement[] stes = th.getStackTrace();
            StackTraceElement ste = stes[2];
            return ste.getClassName();
        }
        /**
         * 根据类名获得logger对象
         * @param className
         * @return
         */
        private static Logger getLogger(String className){
            Logger log = null;
            if(loggerMap.containsKey(className)){
                log = loggerMap.get(className);
            }else{
                try {
                    log = Logger.getLogger(Class.forName(className));
                    loggerMap.put(className, log);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
            return log;
        }
    }
     

    spring型(上个注释自己帮我们log了)

    @Aspect
    @Service
    public class LoggerAdvice {
    
        private Logger logger = Logger.getLogger(this.getClass());
    
        @Before("within(com.example.webmanager..*) && @annotation(loggerManage)")
        public void addBeforeLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
            logger.info("执行 " + loggerManage.description() + " 开始");
            logger.info("地址 "+joinPoint.getSignature().toString());
            logger.info("参数 "+this.parseParames(joinPoint.getArgs()));
        }
    
        @AfterReturning("within(com.example.webmanager..*) && @annotation(loggerManage)")
        public void addAfterReturningLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
            logger.info("执行 " + loggerManage.description() + " 结束");
        }
    
        @AfterThrowing(pointcut = "within(com.example.webmanager..*) && @annotation(loggerManage)", throwing = "ex")
        public void addAfterThrowingLogger(JoinPoint joinPoint, LoggerManage loggerManage, Exception ex) {
            logger.error("执行 " + loggerManage.description() + " 异常", ex);
        }
    
        private String parseParames(Object[] parames) {
            if (null == parames || parames.length <= 0) {
                return "";
            }
            StringBuffer param = new StringBuffer("传入参数[");
            for (Object obj : parames) {
                param.append("{").append(ToStringBuilder.reflectionToString(obj)).append("}  ");
            }
            param.append("]");
            return param.toString();
        }
    
    }
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface LoggerManage {
         String description();
    }
    
  • 相关阅读:
    《一线架构师》之Refined Architecture阶段
    可修改性战术分析
    上周学习总结
    软件质量属性之可修改性
    《信息领域热词分析》实现六种质量属性
    质量属性的六个常见属性应用场景(淘宝篇)
    软件架构师如何工作
    信息领域热词分析
    结合ssh谈MVC架构模式
    PythonCPPJava的异同
  • 原文地址:https://www.cnblogs.com/ydymz/p/8330091.html
Copyright © 2011-2022 走看看