今天看log4j的日志,突然注意到log4j 可以打印行号.
行号之类的信息一般调试的时候会用到,java API 猜测应该不会封装调试器API出来(不清楚调试器的实现)
后来想到了异常堆栈的时候是可以打印行号的,所以是不是可以通过异常获取行号呢?
查看API
StackTraceElement[] java.lang.Throwable.getStackTrace() //堆栈元素
int java.lang.StackTraceElement.getLineNumber() //行号
String java.lang.StackTraceElement.getMethodName() //方法名
而且可以 根据异常堆栈可以找到方法的调用链。
顺便研究一下 log4j 的源码(1.2.16),也是同样的方法实现的:
new Throwable() 然后根据该 Throwable 获取堆栈信息
public LocationInfo getLocationInformation() {
if(locationInfo == null) {
locationInfo = new LocationInfo(new Throwable(), fqnOfCategoryClass);
//org.apache.log4j.spi.LoggingEvent 253 行
}
return locationInfo;
}
//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 发现其实可以从当前线程里面拿到堆栈信息的
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
另外还有一个关于线程信息的类 【 java.lang.management.ThreadInfo 】
ThreadInfo ThreadMXBean.getThreadInfo(long);
//获取不带堆栈信息的 ThreadInfo
ThreadInfo[] ThreadMXBean.dumpAllThreads(boolean, boolean);
//获取所有线程的 ThreadInfo 并带有堆栈信息
转载请保留地址:http://lchshu001.iteye.com/blog/1472583
分享到:
相关推荐
《深入理解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是Apache组织开发的一个开源的日志记录框架,广泛应用于Java应用程序中。作为一款强大的日志处理工具,它提供了灵活的日志配置,允许开发者根据需求调整日志级别、格式和输出位置,极大...