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

  1. public class Log {
  2.  
  3. private static Map<String,Logger> loggerMap = new HashMap<String,Logger>();
  4.  
  5. public static void main(String[] args) throws ClassNotFoundException {
  6. Log.error("自定义LOG","sss444444");
  7. }
  8.  
  9. public static void debug(Object message){
  10. String className = getClassName();
  11. Logger log = getLogger(className);
  12. if(log.isDebugEnabled()){
  13. log.debug(message);
  14. }
  15. }
  16.  
  17. public static void debug(String tag, Object message){
  18. String className = getClassName();
  19. Logger log = getLogger(className);
  20. if(log.isDebugEnabled()){
  21. log.debug(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
  22. }
  23. }
  24.  
  25. public static void info(Object message){
  26. String className = getClassName();
  27. Logger log = getLogger(className);
  28. if(log.isInfoEnabled()){
  29. log.info(message);
  30. }
  31. }
  32.  
  33. public static void info(String tag, Object message){
  34. String className = getClassName();
  35. Logger log = getLogger(className);
  36. if(log.isInfoEnabled()){
  37. log.info(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
  38. }
  39. }
  40.  
  41. public static void warn(Object message){
  42. String className = getClassName();
  43. Logger log = getLogger(className);
  44. log.warn(message);
  45. }
  46.  
  47. public static void warn(String tag, Object message){
  48. String className = getClassName();
  49. Logger log = getLogger(className);
  50. log.warn(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
  51. }
  52.  
  53. public static void error(Object message){
  54. String className = getClassName();
  55. Logger log = getLogger(className);
  56. log.error(message);
  57. }
  58.  
  59. public static void error(String tag, Object message){
  60. String className = getClassName();
  61. Logger log = getLogger(className);
  62. log.error(new StringBuffer().append("【").append(tag).append("】").append(message).toString());
  63. }
  64.  
  65. /**
  66. * 获取最开始的调用者所在类
  67. * @return
  68. */
  69. private static String getClassName(){
  70. Throwable th = new Throwable();
  71. StackTraceElement[] stes = th.getStackTrace();
  72. StackTraceElement ste = stes[2];
  73. return ste.getClassName();
  74. }
  75. /**
  76. * 根据类名获得logger对象
  77. * @param className
  78. * @return
  79. */
  80. private static Logger getLogger(String className){
  81. Logger log = null;
  82. if(loggerMap.containsKey(className)){
  83. log = loggerMap.get(className);
  84. }else{
  85. try {
  86. log = Logger.getLogger(Class.forName(className));
  87. loggerMap.put(className, log);
  88. } catch (ClassNotFoundException e) {
  89. e.printStackTrace();
  90. }
  91. }
  92. return log;
  93. }
  94. }

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

  1. @Aspect
  2. @Service
  3. public class LoggerAdvice {
  4.  
  5. private Logger logger = Logger.getLogger(this.getClass());
  6.  
  7. @Before("within(com.example.webmanager..*) && @annotation(loggerManage)")
  8. public void addBeforeLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
  9. logger.info("执行 " + loggerManage.description() + " 开始");
  10. logger.info("地址 "+joinPoint.getSignature().toString());
  11. logger.info("参数 "+this.parseParames(joinPoint.getArgs()));
  12. }
  13.  
  14. @AfterReturning("within(com.example.webmanager..*) && @annotation(loggerManage)")
  15. public void addAfterReturningLogger(JoinPoint joinPoint, LoggerManage loggerManage) {
  16. logger.info("执行 " + loggerManage.description() + " 结束");
  17. }
  18.  
  19. @AfterThrowing(pointcut = "within(com.example.webmanager..*) && @annotation(loggerManage)", throwing = "ex")
  20. public void addAfterThrowingLogger(JoinPoint joinPoint, LoggerManage loggerManage, Exception ex) {
  21. logger.error("执行 " + loggerManage.description() + " 异常", ex);
  22. }
  23.  
  24. private String parseParames(Object[] parames) {
  25. if (null == parames || parames.length <= 0) {
  26. return "";
  27. }
  28. StringBuffer param = new StringBuffer("传入参数[");
  29. for (Object obj : parames) {
  30. param.append("{").append(ToStringBuilder.reflectionToString(obj)).append("} ");
  31. }
  32. param.append("]");
  33. return param.toString();
  34. }
  35.  
  36. }
  37.  
  38. @Target(ElementType.METHOD)
  39. @Retention(RetentionPolicy.RUNTIME)
  40. @Documented
  41. public @interface LoggerManage {
  42. String description();
  43. }

log4j的终极封装的更多相关文章

  1. SQLHelper、DBUtil终极封装

    DBUtil.java package org.guangsoft.util; import java.io.InputStream; import java.sql.Connection; impo ...

  2. DRF终极封装ViewSet和Router附教程PDF源码

    在DRF官方教程的学习过程中,一个很明显的感受是框架在不断地进行封装,我们自己写框架/工具/脚本/平台也可以模仿模仿,先完成底层代码,再做多层封装,让使用者很容易就上手操作.本文是教程的最后一篇,介绍 ...

  3. 分页Bean终极封装

    package org.guangsoft.vo; import java.util.List; public class Page { private Integer pageNum; privat ...

  4. 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(二)

    Log4j 这个东西,大家都熟悉,就简单的介绍一下,算是一个抛砖引玉,因为我自己在Log日志的搭建方面,没有什么经验,但这东西确实是非常重要的,日后调Bug没有它基本不可能,如果有朋友有什么比较好的L ...

  5. 项目中logger、message错误信息的配置

    申明:在一个项目中必不可少的是Logger和错误信息的配置,现在给出在我们常用的处理方法. —.创建一个ConfigUtils类和他对应的rah.properties文件和Test测试类 Config ...

  6. day86

    视图组件 基于以往我们所用的视图函数,我们发现其中冗余的代码比较多,今天就来对其进行封装,争取做一个代码洁癖者 原来我们的视图函数: class Book(APIView): def get(self ...

  7. RESTframwork之视图view

    一 在view.py 中: class AuthorView(APIView): def get(self, request): author_list = Author.objects.all() ...

  8. IOS项目之弹出动画终结篇

    在之前写过IOS项目之弹出动画一.IOS项目之弹出动画二.IOS项目之弹出动画三,今天来一个终极封装已经上传到Github上弹出动画总结篇UIPopoverTableView. UIPopoverTa ...

  9. 必读的 Android 文章

    必读的 Android 文章 掘金官方 关注 2017.06.07 13:58* 字数 25218 阅读 8782评论 2喜欢 218 写给 Android 开发者的混淆使用手册 - Android ...

随机推荐

  1. .Net EntityFramwork6.0 EF框架开发入门

    一.环境 开发环境:Sqlserver2008 R2.Visual Studio2012   二.准备工作 1.新建MVC空项目 2.通过NuGet获取 EntityFramework 包  操作截图 ...

  2. 图数据库orientDB(1-2)例子

    http://gog.orientdb.com/index.html#/infotab 小朱25岁,出生在教师家庭并且有个姐姐小田,他现在奋斗在帝都.  那么SQL是这样滴!!! CREATE VER ...

  3. linux下的Shell编程(5)循环

    Shell Script中的循环有下面几种格式: while [ cond1 ] && { || } [ cond2 ] -; do - done for var in -; do - ...

  4. 访问远程的docker

        docker version vim /etc/default/docker DOCKER_OPTS="  -Label name=dockerserver2" docke ...

  5. jenkins创建pipeline

    新建任务的时候,有两个流水线相关的任务类型,如下图.其中:流水线更加针对单主干模式的开发,在主干目录下放一个Jenkinsfile文件,其中该文件保存了从SCM拉代码.构建.测试.发布等等流程. 而M ...

  6. 网络配置及shell基础

    一:集群已做完 二:临时配置网络(ip,网关,dns)+永久配置 临时配置网络: ip:    [root@localhost ~]# ifconfig [root@localhost ~]# ifc ...

  7. React-Native(六):React Native完整的demo项目

    该项目在http://www.lcode.org/study-react-native-opensource-two/上发现 更有意思的发现这个网站https://juejin.im/是采用vue.j ...

  8. Hibernate(十三):HQL查询(二)

    背景 基于上一章节<Hibernate(十二):HQL查询(一)>,已经学习了一部分关于HQL的用法: HQL带参数查询 HQL Order By排序查询 HQL 设置实体参数查询 本章节 ...

  9. js分页效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Spring Cloud学习笔记-002

    搭建Spring Cloud注册中心:Eureka 服务注册:在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号.版本号.通信协议等一些附加信息告诉注 ...