- 浏览: 547321 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (740)
- css (4)
- jquery (8)
- javascript (23)
- html (0)
- uml (0)
- 设计模式 (1)
- 开发工具 (14)
- json (4)
- struts 1.x (3)
- spring (3)
- hibernate (6)
- struts 2.x (17)
- JFreechart (0)
- j2se (48)
- jsp (9)
- flex (22)
- 找工作 (1)
- 技术杂谈 (18)
- 网络编程 (5)
- io流 (1)
- ORACLE (15)
- 报表 (3)
- extjs (11)
- jpbm (2)
- swing (5)
- jspereports (3)
- sql (1)
- linux (15)
- ps (1)
- storm (4)
- hbase (8)
- li (0)
- python (1)
- hive (3)
- 机器学习 (1)
- hdfs (1)
- elasticsearch (1)
- hadoop 2.2 (5)
- hadoop (1)
最新评论
-
Tristan_S:
这个有点意思
ASM -
starryskydog:
程序修改detail band部分的样式 如内容字体大小 ...
使用jasperReport实现动态表头 -
samwong:
Good, so usefule
使用YUI Compressor压缩CSS/JS -
gc715409742:
能够告诉我怎么在web项目中使用YUI Compressor? ...
使用YUI Compressor压缩CSS/JS -
JsonTeye:
您好! 我看你的代码,我现在也在做动态报表,实现功能由用户自己 ...
使用jasperreport动态生成pdf,excel,html
log4jjava
今天看log4j的日志,突然注意到log4j 可以打印行号.
行号之类的信息一般调试的时候会用到,java API 猜测应该不会封装调试器API出来(不清楚调试器的实现)
后来想到了异常堆栈的时候是可以打印行号的,所以是不是可以通过异常获取行号呢?
查看API
Java代码 收藏代码
StackTraceElement[] java.lang.Throwable.getStackTrace() //堆栈元素
int java.lang.StackTraceElement.getLineNumber() //行号
String java.lang.StackTraceElement.getMethodName() //方法名
而且可以 根据异常堆栈可以找到方法的调用链。
顺便研究一下 log4j 的源码(1.2.16),也是同样的方法实现的:
new Throwable() 然后根据该 Throwable 获取堆栈信息
Java代码 收藏代码
public LocationInfo getLocationInformation() {
if(locationInfo == null) {
locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass);
//org.apache.log4j.spi.LoggingEvent 253 行
}
return locationInfo;
}
Java代码 收藏代码
//org.apache.log4j.spi.LocationInfo 138 行
public LocationInfo(Throwable t, String fqnOfCallingClass) {
Object[] noArgs = null;
Object[] elements = (Object[]) getStackTraceMethod.invoke(t, noArgs);
String prevClass = NA;
for(int i = elements.length - 1; i >= 0; i--) {
String thisClass = (String) getClassNameMethod.invoke(elements[i], noArgs);
if(fqnOfCallingClass.equals(thisClass)) {
int caller = i + 1;
if (caller < elements.length) {
className = prevClass;
methodName = (String) getMethodNameMethod.invoke(elements[caller], noArgs);
fileName = (String) getFileNameMethod.invoke(elements[caller], noArgs);
if (fileName == null) {
fileName = NA;
}
int line = ((Integer) getLineNumberMethod.invoke(elements[caller], noArgs)).intValue();
if (line < 0) {
lineNumber = NA;
} else {
lineNumber = String.valueOf(line);
}
StringBuffer buf = new StringBuffer();
buf.append(className);
buf.append(".");
buf.append(methodName);
buf.append("(");
buf.append(fileName);
buf.append(":");
buf.append(lineNumber);
buf.append(")");
this.fullInfo = buf.toString();
}
return;
}
prevClass = thisClass;
}
return;
//其他代码
不清楚调试器是怎么实现的.
重新看了一下JDK 发现其实可以从当前线程里面拿到堆栈信息的
Java代码 收藏代码
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
另外还有一个关于线程信息的类 【 java.lang.management.ThreadInfo 】
Java代码 收藏代码
ThreadInfo ThreadMXBean.getThreadInfo(long);
//获取不带堆栈信息的 ThreadInfo
ThreadInfo[] ThreadMXBean.dumpAllThreads(boolean, boolean);
//获取所有线程的 ThreadInfo 并带有堆栈信息
转载请保留地址:http://lchshu001.iteye.com/blog/1472583
今天看log4j的日志,突然注意到log4j 可以打印行号.
行号之类的信息一般调试的时候会用到,java API 猜测应该不会封装调试器API出来(不清楚调试器的实现)
后来想到了异常堆栈的时候是可以打印行号的,所以是不是可以通过异常获取行号呢?
查看API
Java代码 收藏代码
StackTraceElement[] java.lang.Throwable.getStackTrace() //堆栈元素
int java.lang.StackTraceElement.getLineNumber() //行号
String java.lang.StackTraceElement.getMethodName() //方法名
而且可以 根据异常堆栈可以找到方法的调用链。
顺便研究一下 log4j 的源码(1.2.16),也是同样的方法实现的:
new Throwable() 然后根据该 Throwable 获取堆栈信息
Java代码 收藏代码
public LocationInfo getLocationInformation() {
if(locationInfo == null) {
locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass);
//org.apache.log4j.spi.LoggingEvent 253 行
}
return locationInfo;
}
Java代码 收藏代码
//org.apache.log4j.spi.LocationInfo 138 行
public LocationInfo(Throwable t, String fqnOfCallingClass) {
Object[] noArgs = null;
Object[] elements = (Object[]) getStackTraceMethod.invoke(t, noArgs);
String prevClass = NA;
for(int i = elements.length - 1; i >= 0; i--) {
String thisClass = (String) getClassNameMethod.invoke(elements[i], noArgs);
if(fqnOfCallingClass.equals(thisClass)) {
int caller = i + 1;
if (caller < elements.length) {
className = prevClass;
methodName = (String) getMethodNameMethod.invoke(elements[caller], noArgs);
fileName = (String) getFileNameMethod.invoke(elements[caller], noArgs);
if (fileName == null) {
fileName = NA;
}
int line = ((Integer) getLineNumberMethod.invoke(elements[caller], noArgs)).intValue();
if (line < 0) {
lineNumber = NA;
} else {
lineNumber = String.valueOf(line);
}
StringBuffer buf = new StringBuffer();
buf.append(className);
buf.append(".");
buf.append(methodName);
buf.append("(");
buf.append(fileName);
buf.append(":");
buf.append(lineNumber);
buf.append(")");
this.fullInfo = buf.toString();
}
return;
}
prevClass = thisClass;
}
return;
//其他代码
不清楚调试器是怎么实现的.
重新看了一下JDK 发现其实可以从当前线程里面拿到堆栈信息的
Java代码 收藏代码
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
另外还有一个关于线程信息的类 【 java.lang.management.ThreadInfo 】
Java代码 收藏代码
ThreadInfo ThreadMXBean.getThreadInfo(long);
//获取不带堆栈信息的 ThreadInfo
ThreadInfo[] ThreadMXBean.dumpAllThreads(boolean, boolean);
//获取所有线程的 ThreadInfo 并带有堆栈信息
转载请保留地址:http://lchshu001.iteye.com/blog/1472583
发表评论
-
使用Java调用谷歌搜索
2013-10-19 12:50 901转自:http://yangshangchuan.iteye ... -
走出类加载器迷宫
2013-10-16 14:22 691这是前几天在看类加载器机制时搜到的一篇旧文,网上搜了搜 ... -
Log4j使用
2012-12-05 11:34 784... -
Java的JDBC数据库连接池实现方法
2012-09-14 10:20 742虽然J2EE程序员一般都有现成的应用服务器所带的JDBC数据库 ... -
什么是线程安全和线程不安全
2012-08-23 14:49 794什么是线程安全和线程 ... -
线程运行栈信息的获取
2012-08-23 14:49 832线程运行栈信息的获取 ... -
javassist【动态改字节码】学习三
2012-08-23 14:50 2669这里举个简单的例子,来记录下如何用CtClass创建一个类,并 ... -
javassist【动态改字节码】学习二
2012-08-22 11:53 839写了个例子。 有一个类: Java代码 package ... -
javassist[动态改字节码]学习一
2012-08-22 11:52 904前段时间为了公司里的 ... -
JVM启动参数
2012-08-22 11:51 947一、标准参数 1.-server -client 虚拟机服务器 ... -
使用javassist动态注入代码
2012-08-22 11:33 788关于java字节码的处理,目前有很多工具,如bcel,asm。 ... -
利用javaassist修改Class文件
2012-08-22 11:22 1504我们在开发中有时候会遇到这样的问题,就是使用的某个第三方包中的 ... -
JavaMail
2012-08-16 20:03 951在Java EE应用程序中,经常需要发送E-mail。Java ... -
让java变成脚本语言
2012-08-15 12:42 0今天在弄游戏的GM模块,大部分gm命令很简单,只是单纯改 ... -
JavaAgent
2012-08-13 23:43 1277-javaagent 这个JVM参数是JDK 5引进的. j ... -
在Eclipse RCP中实现控制反转(IoC)
2012-08-13 23:13 972摘要:这篇文章描述了 ... -
aop的几种实现方式
2012-08-05 21:14 9491 AOP各种的实现 AOP就是面向切面编程,我们可以从 ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-07-28 21:36 596http://www.iteye.com/magazines/ ... -
java基础拾遗
2012-06-17 10:05 882. 电梯直达 楼主 发表于 2012-1-28 13: ... -
使用 HttpClient 和 HtmlParser 实现简易爬
2012-05-01 17:57 1104使用 HttpClient 和 HtmlParse ...
相关推荐
《深入理解Log4j:基于1.2.17版本》 在软件开发过程中,日志记录是一项至关重要的任务,它能够帮助开发者在程序出现问题时迅速定位错误,同时也能记录系统运行状态,便于后期分析与优化。Log4j,作为Java世界中最...
- `log4j.appender.stdout.layout.ConversionPattern`: 定义了日志的格式,包括日期(`%d{ABSOLUTE}`)、优先级(`%5p`)、类名(`%c{1}`)、行号(`%L`)和消息(`%m`)等。 ##### 2. FileAppender配置 ```properties log4j...
**日志框架Log4j详解** 在Java编程中,日志记录是不可或缺的一部分,它用于追踪应用程序的运行状态,帮助开发者在出现问题时定位错误。Log4j是Apache组织开发的一个强大的、灵活的日志记录框架,它允许我们控制日志...
比如,`log4j.appender.Console.layout=org.apache.log4j.PatternLayout`,并设置`log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n`,这样日志会显示时间、级别、类名、行号和...
- 官方网站:Apache官方网站是获取最新Log4j版本的首选途径(http://logging.apache.org/log4j/2.x/)。 - 版本选择:确保选择与你的项目兼容的版本,如Log4j 2.x系列是最新的稳定版本。 - 下载文件:通常,你会...
2. **创建配置文件**:在`CLASSPATH`中创建`log4j.properties`配置文件,这是Log4j获取配置信息的地方。 3. **配置内容**:配置文件中的关键设置包括: - `log4j.rootCategory=INFO, stdout, R`:这行定义了日志的...
Log4j是Apache组织开发的一款强大的Java日志记录框架,被广泛应用于各种Java项目中,以提供灵活的日志输出和管理。它允许开发者控制日志信息的输出级别、格式以及输出位置,帮助调试和监控系统运行状态。Log4j的核心...
Log4j是Apache的一个开源项目,它为Java应用程序提供了一个灵活的日志系统。这个系统能够帮助开发者记录程序运行过程中的各种信息,包括错误、警告、调试信息等,这对于软件的维护和故障排查至关重要。Log4j的核心...
《深入理解Log4j:基于1.2.14版本的分析》 在Java开发领域,日志管理是一项至关重要的任务,它可以帮助开发者追踪程序运行状态,定位问题,以及进行性能监控。Log4j作为Apache组织开发的一个开源日志框架,因其强大...
**日志框架Log4j详解** Log4j是Apache组织提供的一款开源的日志记录工具,广泛应用于Java开发中。它提供了灵活的日志记录方式,帮助开发者进行系统运行情况的跟踪、调试以及信息输出,对于软件的维护和问题定位至关...
在Java代码中,首先需要导入`org.apache.log4j.Logger`,然后通过`Logger.getLogger()`方法获取日志器实例。接着,使用`debug()`, `info()`, `warn()`, `error()`, `fatal()`等方法记录不同级别的日志。例如: ```...
**Java Log4j 示例** Java Log4j 是一个广泛使用的日志记录框架,它为Java应用程序提供了灵活且高效的日志管理。Log4j 提供了丰富的功能,包括配置日志级别、输出格式、日志目的地等,使得开发者可以方便地进行调试...
#### 四、Log4j的使用 在代码中使用Log4j非常简单,只需要通过`LogFactory.getLog()`方法获取对应的Logger实例即可。例如: ```java protected final Log log = LogFactory.getLog(getClass()); if (log....
### Java中log4j的使用方法详解 #### 一、log4j简介 Log4j是Apache的一个开源项目,用于实现日志记录功能。它提供了一种高度灵活的日志记录框架,可以方便地控制日志的输出级别、格式以及目标(如控制台、文件等)...
**Log4j简介** Log4j是Apache软件基金会的一个开源项目,它是一个广泛使用的Java日志框架。在软件开发中,日志记录是一项至关重要的任务,因为它有助于追踪应用程序的运行状态,定位错误和异常,以及进行性能分析。...
Log4j的核心组件包括配置文件(通常为log4j.properties或log4j.xml)、Logger(记录日志的对象)、Appender(负责将日志输出到指定目的地)和Layout(定义日志信息的格式)。配置文件定义了日志级别(如DEBUG、INFO...
### Log4J 教程详解 #### Log4j 概述 Log4j 是一个流行的开源日志框架,被广泛应用于 Java 应用程序中。它由 Apache 软件基金会维护,因其高度的灵活性、丰富的功能以及易于配置等特点而备受青睐。与传统的 `System...
**Log4j日志框架详解** Log4j是Apache组织开发的一个开源的日志记录框架,广泛应用于Java应用程序中。作为一款强大的日志处理工具,它提供了灵活的日志配置,允许开发者根据需求调整日志级别、格式和输出位置,极大...