`
- 浏览:
3472310 次
- 性别:
- 来自:
杭州
-
恰好看到关于log的讨论。想起以前调查的一个问题。整理出来,希望对大家能有所帮助。
Sun JDK 源代码下载 http://wwws.sun.com/software/communitysource/
先注册并登录到“Sun Community Source Licensing”,然后下载J2SE(几十兆)或者J2EE(几百兆)。
Log能够把代码运行时间,类名,方法名,还有信息,全部都打印出来。
一个直观的例子,每次启动Tomcat(缺省配置)的时候。一般可以看到
Jul 9, 2004 11:22:29 AM org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.webapp.admin.ApplicationResources', returnNull=true
Jul 9, 2004 11:22:41 AM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on port 8080
时间,类名,方法名,信息都打印了出来。
那么,log是如何获取调用自身的这个类和这个方法名的呢?
后面给出的代码是JDK1.4的源代码,和Log4J的源代码。说明其实现原理。
获得调用类,和方法名,就是需要获得当前运行栈的结构。
new Throwable().getStackTrace() 会返回当前运行栈的结构层次。
利用这种原理,可以获得整个运行栈的调用关系。
JDK1.4的java.util.logging包, 通过Throwable.getStackTrace()方法实现的。
// Get the stack trace.
StackTraceElement stack[] = (new Throwable()).getStackTrace();
完整的代码在JDK1.4的源代码里面,java.util.logging.LogRecord类的inferCaller方法。
-
-
privatevoidinferCaller(){
-
needToInferCaller=false;
-
-
StackTraceElementstack[]=(newThrowable()).getStackTrace();
-
-
intix=0;
-
while(ix<stack.length){
-
StackTraceElementframe=stack[ix];
-
Stringcname=frame.getClassName();
-
if(cname.equals("java.util.logging.Logger")){
-
break;
-
}
-
ix++;
-
}
-
-
while(ix<stack.length){
-
StackTraceElementframe=stack[ix];
-
Stringcname=frame.getClassName();
-
if(!cname.equals("java.util.logging.Logger")){
-
-
setSourceClassName(cname);
-
setSourceMethodName(frame.getMethodName());
-
return;
-
}
-
ix++;
-
}
-
-
-
}
Log4j有异曲同工之妙。org.apache.log4j.spi.LocationInfo类。先用Throwable.printStackTrace()方法把Exception信息打印到一个字符串里。然后按行分析这个字符串。抽出调用类和方法。参见LocationInfo类的构造函数。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
publicLocationInfo(Throwablet,StringfqnOfCallingClass)
e.printStackTrace()把Exception发生当时的整个运行栈结构展开,打印出来。Log4J就是分析这个打印结果,获得所有的调用层次。关于直接获取调用类名的方法。我们来看sun.reflect.Reflection的getCallerClass()方法的说明。
-
-
-
-
-
-
-
-
-
-
publicstaticnativeClassgetCallerClass(intrealFramesToSkip);
这是一个native方法。原理也是根据StackFrame(运行栈)获取相应类的信息。这个方法直接返回一个Class名字,直接有效。参数realFramesToSkip用来选取你所需要的Stack层次,所以,你可以用这个方法获得任何层次的上的调用类名。Throwable.getStackTrace()也是一个native方法。原理也是根据StackFrame(运行栈)获取相应类的信息。返回一个StackTraceElement[]。StackTraceElement类在JDK1.4的java.lang的包里面。里面包含丰富的信息,非常适合Debug。StackTraceElement类有如下方法:getFileName(),getLineNumber(), getClassName(), getMethodName()。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
(1)在测试类中调用UserDaoImp类的addUser(User user)方法,添加用户,然后用findUser(String uName)方法查找并输出用户信息 (2)在测试类中调用UserDaoImp1类的findUser(String uName)方法,使用不存在的...
robotframework调⽤python类⽅法_(五)RobotFramework基 础。。。 上⼀⼩节,你已经感受到了 Robot Framework 的基本说法,这⼀⼩节你将会看到 Robot Framework 更多强⼤的⽤法。 if 语句 通过 "run keyword if" ...
Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用
C#调用Log4net写日志例子源码
NULL 博文链接:https://rednaxelafx.iteye.com/blog/548536
android 下方便的打印log 在sd上写入log
(1)在测试类中调用UserDaoImp类的addUser(User user)方法,添加用户,然后用findUser(String uName)方法查找并输出用户信息 (2)在测试类中调用UserDaoImp1类的findUser(String uName)方法,使用不存在的...
log4j的使用习惯,让每个类都拥有一个private static的Logger对象,用来输出该类中的全部日志信息 ,使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意:在一...
NULL 博文链接:https://yxhcquedu.iteye.com/blog/1217830
这里要实现的是通过python调用top命令,并获得cpu的利用率信息。 用过popen的朋友很快就能想到类似如下的代码(这个是我第一次写的代码,*_*): 复制代码 代码如下: #! /usr/bin/python import
log4z
(2) MyAspect类中包含权限检查方法checkPermission()和记录日志方法log(),代码如下: (3) 要求在addUser和deleteUser方法开头进行权限检查,结束记录日志。传统方法的实现如下(看看就行): deleteUser方法同样处理在...
.NET下WPF中调用log4.net记录日志的代码示例
1 在网络条件不好的情况下在全屏和竖屏两个Activity之间切换可能会出错退出,原因是官方播放库中的线程没有做线程分离,在log中可以看到错误信息,这个问题在应用层没法改。如果只是在一个页面播放而不跳新页面则没...
用户使用时,只可调用以 TRACE_ 和 DEBUG_ 打头的宏定义函数 当软件的多个进程被启动时,会创建新的log文件,即也是进程安全的 本模块是异步在一个独立的线程中运行,是线程安全的,不会导致阻塞调用处的进程 使用时...
log4j示例项目,里面包含了log4j需要的两个包,以及设置的方法,调用的方法。
最近在学习C#如果通过MX Componet 实现与三菱PLC的读写,ascii,int类型的读写,以及用log4记录log
* 自定义Log打印类 * 在打印给定字符的同时,还打印出所在语句的方法名、行号、类名,甚至详细调用栈等信息 * 可通过DEBUG控制是否打印 * 可通过POSITION控制是否打印所在语句信息
使用spdlog作为日志系统,封装了一个日志类,并附带arm linux下的库和CMake文件,直接可以将代码编译为so库,供其他模块调用。 1、接口函数debug级log_d和LOG_D(大写为写入日志文件); 2、接口函数Info级log_i和LOG_...
Java调用zabbix API获取监控信息相关jar包,包括zabbix4j-0.1.jar、httpclient-4.3.1.jar、httpcore-4.3.jar、lombok.jar、slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.1.jar、commons-codec-1.6.jar、commons-logging-...