模拟log4j获取日志对象调用所在的类名、方法名及行号
当我们在记录日志时,每个类中会定义一个日志对象,然后利用这个对象去写日志,那么我们在处理日志时,如何能才能记录日志对象所在的类、方法和行号呢?log4j中已经实现了该功能,那么它是怎么实现的呢?
其实我们可以这样,在要写日志的代码时获得当前的线程信息,这样我们就可以获得上个线程的信息了(即对象写日志所在类的信息)。
先看以下列子。
新建Location类和Test类:
Location:
public class Location {
public void getInfo(){
String location="";
StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
location = "类名:"+stacks[2].getClassName() + "\n函数名:" + stacks[2].getMethodName()
+ "\n文件名:" + stacks[2].getFileName() + "\n行号:"
+ stacks[2].getLineNumber() + "";
System.out.println(location);
}
}
Test:
public class Test {
public static void main(String[] args) {
Location l = new Location();
l.getInfo();
}
}
执行Test中的main函数,得到以下结果:
类名:thread.Test
函数名:main
文件名:Test.java
行号:10
是不是输出了Test类中调用的信息呢?那么有很多人就问了,为什么location类中调用的是stacts[2]而不是stacts[0]或其他的呢?
针对这个问题,我们可以将stacts数组里面的东西遍历输出一下就知道了:
StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
for(int i=0;i<stacks.length;i++){
location = i+" at "+stacks[i].getClassName() + "." + stacks[i].getMethodName()
+ "(" + stacks[i].getFileName() + ":"
+ stacks[i].getLineNumber() + ")";
System.out.println(location);
}
再次执行,输出结果如下:
0 at java.lang.Thread.getStackTrace(Thread.java:1436)
1 at thread.Location.getInfo(Location.java:6)
2 at thread.Test.main(Test.java:7)
那么这就好理解了,线程是以栈形式存放的,
分析一下StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
此代码中会创建2个线程,调用Thread.currentThread().getStackTrace()时底层会创建一个线程,我们调用它也会创建一个线程,然后test调用getInfo函数时会创建一个线程,这样总共就三个线程了,程序执行顺序是先test类中调用getInfo方法,然后getInfo方法中调用StackTraceElement[] stacks = Thread.currentThread().getStackTrace();调用StackTraceElement[] stacks = Thread.currentThread().getStackTrace();时底层还会创建一个线程,根据栈的原理先进后出规则,他们的排队顺序就是上面输出的结果了。
模拟log4j获取日志对象调用所在的类名、方法名及行号的更多相关文章
- Java: 获取当前执行位置的文件名/类名/方法名/行号
在 JAVA 程序有时需要获取当前代码位置, 于是就利用 Thread.currentThread().getStackTrace() 写了下面这个工具类, 用来获取当前执行位置处代码的文件名/类名/ ...
- 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值
package com.Summer_0426.cn; /** * @author Summer * 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值 * */ public ...
- java获取调用当前方法的方法名和行数
java获取调用当前方法的方法名和行数String className = Thread.currentThread().getStackTrace()[2].getClassName();//调用的 ...
- WPF 异常其他信息: “对类型“BaseControl.KImgButton”的构造函数执行符合指定的绑定约束的调用时引发了异常。”,行号为“38”,行位置为“22”。
引发的异常:“System.Windows.Markup.XamlParseException”(位于 PresentationFramework.dll 中) 其他信息: “对类型“BaseCont ...
- 获取LayoutInflater对象的方法和inflate方法的一些参数问题
一.获取LayoutInflater的三种方法 1. LayoutInflater layoutInflater = (LayoutInflater) MainActivity.this.getSys ...
- 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型
我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...
- 反射的妙用-类名方法名做参数进行方法调用实例demo
首先声明一点,大家都会说反射的效率低下,但是大多数的框架能少了反射吗?当反射能为我们带来代码上的方便就可以用,如有不当之处还望大家指出 1,项目结构图如下所示:一个ClassLb类库项目,一个为测试用 ...
- Java父类对象调用子类实体:方法重写与动态调用
众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例 ...
- Asp.net .net(C#) 获取当前命名空间,类名,方法名的方法
public static string GetMethodInfo() { string str = ""; //取得当前方法命名空间 str += & ...
随机推荐
- 静态成员变量.xml
pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...
- 使用FTP搭建YUM
VSFTP搭建YUM源 1.安装FTP [root@FTP kel]# rpm -qa |grep vsftp vsftpd-2.2.2-6.el6_0.1.x86_64 首先需要安装的ftp软件为v ...
- 二叉树单色路径最长&&穿珠子
对树的操作,特别理解递归的好处. //对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的 //另一点结束而形成的路径,而路 ...
- string subscript out of range
刚刚练习华为机试上的题目遇到了这个问题,奉上两个小题: //题目描述 // //描述: //输入一个整数,将这个整数以字符串的形式逆序输出 //程序不考虑负数的情况,若数字含有0,则逆序形式也含有0, ...
- qqq
http://blog.sina.com.cn/s/blog_6f0774010100wawd.html http://www.2cto.com/kf/201302/189135.html http: ...
- VHDL之Port map and open
编SPI的master控制器,使用公司基本的元件,有些端口用不着,恰巧好二哥(不知年龄的数字组组长,本名Holger)来了,于是请教之,告曰open关键词.后来深感自己VHDL水平太水,下了一本电子书 ...
- Python 读取文件下所有内容、获取文件名、截取字符、写回文件
# coding=gbk import os import os.path #读取目录下的所有文件,包括嵌套的文件夹 def GetFileList(dir, fileList): newDir ...
- geeksforgeeks@ Find sum of different corresponding bits for all pairs (Bit manipulation)
http://www.practice.geeksforgeeks.org/problem-page.php?pid=387 Find sum of different corresponding b ...
- Tmux常用快捷键以及我会常到的一些问题汇总
今天部署测试服务器环境 使用到了tmux 刚开始我把tmux想象成了像omzsh这种shell 但是被指出是错误的,tmux类似于在shell里面的软件.我还真是第一次接触到这个概念. 首先安装 br ...
- 让一个div可以编辑加上contenteditable=true 复制来的内容带有样式,需要清除复制的样式
sEv传keyup进去 function(id,sEv){ id.on(sEv,function(){ var str = $(this).html(); //获取复制进来的内容 var re=/&l ...