写代码的时候,很多类里需要打日志,一般写法都是:

Logger log =  LoggerFactory.getLogger(XXX.class); // 或者参数给的是类名字符串

每个类里面都要写,好烦,能否封装一下,自动获取使用日志的类名,这样就不用每个类里都写了:

一个百试不爽的实现方式(通过异常栈获取):

public static Logger getLogger() {Logger logger = Logger.getLogger(getInvokingClassName());PropertyConfigurator.configure(getConfigFileName());return logger;
}
public static String getInvokingClassName()
{return new Throwable().getStackTrace()[2].getClassName();
}

有人说这样的方式性能会有问题,网上有人给出了如下几种方式取得类名:

 // 1、通过SecurityManager的保护方法getClassContext()  String clazzName = new SecurityManager() {  public String getClassName() {  return getClassContext()[1].getName();  }  }.getClassName();  System.out.println(clazzName); ****以上这个总觉得哪里有限制*****2、通过分析匿名类名称()  String clazzName3 = new Object() {  public String getClassName() {  String clazzName = this.getClass().getName();  return clazzName.substring(0, clazzName.lastIndexOf('$'));  }  }.getClassName();  System.out.println(clazzName3);3、通过Thread的方法getStackTrace()  String clazzName4 = Thread.currentThread().getStackTrace()[2].getClassName();  System.out.println(clazzName4);注意:虽然以上3中方式都可以拿到类名,但是,写日志的时候,我们是要从日志里看出日志是出自那个类,而以上3中都只能显示其自身所在的类信息,却得不到正在写日志的类的信息。

其实,文首给出的实现也是jdk里的实现方式:

后面给出的代码是JDK1.4的源代码,和Log4J的源代码。说明其实现原理。
获得调用类,和方法名,就是需要获得当前运行栈的结构。
new Throwable().getStackTrace() 会返回当前运行栈的结构层次。
利用这种原理,可以获得整个运行栈的调用关系。

JDK1.4的java.util.logging包, 通过Throwable.getStackTrace()方法实现的。
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();

log4j的实现也是异曲同工:

org.apache.log4j.spi.LocationInfo类。
先用Throwable.printStackTrace()方法把Exception信息打印到一个字符串里。
然后按行分析这个字符串。抽出调用类和方法。

JDK1.5在Thread类里面引入了getStackTrace()和getAllStackTraces()两个方法。这下子,我们不用 (new Throwable()).getStackTrace ();可以调用

Thread.getCurrentThread().getStackTrace()来获得当前线程的运行栈信息。不仅如此,只要权限允许,还可以获得其它线程的运行栈信息。不幸的是,虽然可以拿到栈信息,但是日志打印的时候依然显示的是Thread.getCurrentThread().getStackTrace()该语句所在的类的信息。

转载于:https://blog.51cto.com/langlichong/1791773

避免每个类中都初始化日志类相关推荐

  1. java对类对象初始化_Java类和对象初始化

    Java类和对象初始化Tag内容描述: 1.解析 Java 类和对象的初始化过程 由一个单态模式引出的问题谈起 北京高伟达西南分软 Java EE 软件工程师 三年 Java EE 项目经验 行业方向 ...

  2. python类属性初始化_Python类定义、属性、初始化和析构

    类的定义,属性和方法概念 方法中self的作用和意义 初始化( __init__ ) 和 析构方法( __del__ ) 类的定义 class 类名 实例 实例名 = 类名() 一个"实例& ...

  3. 初始化对于类与接口的异同点深入解析

    在上一次[http://www.cnblogs.com/webor2006/p/8905978.html]中学习了类加载器理论的一些内容,其中回顾一下关于类的初始化时机的这段文字: 而截图中也说明了这 ...

  4. 日志类Logger的基本使用

    Logger的基本使用 java开发过程中经常需要打印日志信息,往往会在每个类的第一行加上形如以下代码: protected static final Logger logger = LoggerFa ...

  5. php键顺序初始化,Java类中各成员初始化的顺序

    了解Java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识.不说太多,直接看下面的例子 class Father { static{ System. out.println(&quo ...

  6. 关于“只有静态常量整型数据成员才可以在类中初始化”

    关于"只有静态常量整型数据成员才可以在类中初始化" 关于类中的静态成员变量, 在类中只能声明,不能定义 注意在类的内部只是声明,不是定义 类中的静态变量是属于类的,不属于某个对象! ...

  7. java 虚拟机 初始化_【深入理解Java虚拟机】类的初始化过程

    类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...

  8. Java程序员从笨鸟到菜鸟之(九十四)深入java虚拟机(三)——类的生命周期(下)类的初始化...

    上接深入java虚拟机--深入java虚拟机(二)--类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后 ...

  9. python的类包括_Python的类,复杂吗

    是菜鸟学python的第38篇原创文章 阅读本文大概需要6分钟 高级语言都有面对对象,Python也不例外,比起c++,java这些传统的语言,Python中的面对对象去掉了很多复杂的东西,理解和使用 ...

最新文章

  1. 为节省内存,Firefox 将用新方式阻止加载没用到的标签页
  2. MySQL的诡异同步问题-重复执行一条relay-log
  3. spring cloud 微服务调用--ribbon和feign调用
  4. C++走向远洋——63(项目二2、两个成员的类模板)
  5. 外媒:苹果首款AR/VR设备需与iPhone绑定使用,最早明年发布
  6. extern 与 #define 使用说明
  7. @程序员,你真的懂数据可视化吗?
  8. OpenJDK8 JAVA应用窗口在不同缩放比例下的表现(Windows10)
  9. electron编译nodejs模块的方法
  10. 增长量计算n+1原则_我是如何快速做资料分析的?(二)
  11. NSGA2算法中文版详细介绍
  12. flash在线拍照并上传
  13. 京东淘宝等电脑网页打不开的解决办法
  14. 极速office(word)如何在方框内打钩
  15. [正则表达式] 校验经度和纬度
  16. java jersey_Java Jersey使用总结(转)
  17. 在路由器 RT-AC68U 使用自定义 DDNS 用 3322.org 动态域名的方法
  18. 抛弃Eclipse,投入IDEA 的独孤求败江湖
  19. elastic search 如何将yellow 状态变为green健康状态
  20. Android应用性能剖析全攻略

热门文章

  1. 杨森翔的书法:正月十六试笔【圆光、斗方】
  2. [转] Firefox 24.0中的插件激活提示
  3. spring中lazy-init详解
  4. hdu4411 经典费用里建图
  5. C语言-数组名真的不是指针
  6. 【数字信号处理】线性常系数差分方程 ( 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 “ 线性时不变系统 “ 案例 | 根据 “ 线性时不变系统 “ 定义证明 )
  7. 006-1MOS管工作原理精讲
  8. HTTP状态码--含义
  9. bzoj 3223: Tyvj 1729 文艺平衡树
  10. C# 给word文档添加水印