`
lchshu001
  • 浏览: 24775 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

log4j 获取行号

阅读更多
今天看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:基于1.2.17版本》 在软件开发过程中,日志记录是一项至关重要的任务,它能够帮助开发者在程序出现问题时迅速定位错误,同时也能记录系统运行状态,便于后期分析与优化。Log4j,作为Java世界中最...

    log4j.properties配置文件

    - `log4j.appender.stdout.layout.ConversionPattern`: 定义了日志的格式,包括日期(`%d{ABSOLUTE}`)、优先级(`%5p`)、类名(`%c{1}`)、行号(`%L`)和消息(`%m`)等。 ##### 2. FileAppender配置 ```properties log4j...

    log4j多个简单实例

    **日志框架Log4j详解** 在Java编程中,日志记录是不可或缺的一部分,它用于追踪应用程序的运行状态,帮助开发者在出现问题时定位错误。Log4j是Apache组织开发的一个强大的、灵活的日志记录框架,它允许我们控制日志...

    log4j需要的jar以及properties文件

    比如,`log4j.appender.Console.layout=org.apache.log4j.PatternLayout`,并设置`log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n`,这样日志会显示时间、级别、类名、行号和...

    Log4j api 下载

    - 官方网站:Apache官方网站是获取最新Log4j版本的首选途径(http://logging.apache.org/log4j/2.x/)。 - 版本选择:确保选择与你的项目兼容的版本,如Log4j 2.x系列是最新的稳定版本。 - 下载文件:通常,你会...

    apache log4j使用大全

    2. **创建配置文件**:在`CLASSPATH`中创建`log4j.properties`配置文件,这是Log4j获取配置信息的地方。 3. **配置内容**:配置文件中的关键设置包括: - `log4j.rootCategory=INFO, stdout, R`:这行定义了日志的...

    Log4j+使用方法+配置文件log4j.properties

    Log4j是Apache组织开发的一款强大的Java日志记录框架,被广泛应用于各种Java项目中,以提供灵活的日志输出和管理。它允许开发者控制日志信息的输出级别、格式以及输出位置,帮助调试和监控系统运行状态。Log4j的核心...

    log4j添加日志到数据库和文件中

    Log4j是Apache的一个开源项目,它为Java应用程序提供了一个灵活的日志系统。这个系统能够帮助开发者记录程序运行过程中的各种信息,包括错误、警告、调试信息等,这对于软件的维护和故障排查至关重要。Log4j的核心...

    log4j-1.2.14.jar.zip 335k

    《深入理解Log4j:基于1.2.14版本的分析》 在Java开发领域,日志管理是一项至关重要的任务,它可以帮助开发者追踪程序运行状态,定位问题,以及进行性能监控。Log4j作为Apache组织开发的一个开源日志框架,因其强大...

    log4j使用详细方法

    **日志框架Log4j详解** Log4j是Apache组织提供的一款开源的日志记录工具,广泛应用于Java开发中。它提供了灵活的日志记录方式,帮助开发者进行系统运行情况的跟踪、调试以及信息输出,对于软件的维护和问题定位至关...

    log4j api log4j

    在Java代码中,首先需要导入`org.apache.log4j.Logger`,然后通过`Logger.getLogger()`方法获取日志器实例。接着,使用`debug()`, `info()`, `warn()`, `error()`, `fatal()`等方法记录不同级别的日志。例如: ```...

    java log4j 示例

    **Java Log4j 示例** Java Log4j 是一个广泛使用的日志记录框架,它为Java应用程序提供了灵活且高效的日志管理。Log4j 提供了丰富的功能,包括配置日志级别、输出格式、日志目的地等,使得开发者可以方便地进行调试...

    log4j配置详解 新手入门教程

    #### 四、Log4j的使用 在代码中使用Log4j非常简单,只需要通过`LogFactory.getLog()`方法获取对应的Logger实例即可。例如: ```java protected final Log log = LogFactory.getLog(getClass()); if (log....

    详细讲解Java中log4j的使用方法

    ### Java中log4j的使用方法详解 #### 一、log4j简介 Log4j是Apache的一个开源项目,用于实现日志记录功能。它提供了一种高度灵活的日志记录框架,可以方便地控制日志的输出级别、格式以及目标(如控制台、文件等)...

    log4j的jar包以及配置文件

    **Log4j简介** Log4j是Apache软件基金会的一个开源项目,它是一个广泛使用的Java日志框架。在软件开发中,日志记录是一项至关重要的任务,因为它有助于追踪应用程序的运行状态,定位错误和异常,以及进行性能分析。...

    log4j实例java工程.zip

    Log4j的核心组件包括配置文件(通常为log4j.properties或log4j.xml)、Logger(记录日志的对象)、Appender(负责将日志输出到指定目的地)和Layout(定义日志信息的格式)。配置文件定义了日志级别(如DEBUG、INFO...

    log4j日志框架

    **Log4j日志框架详解** Log4j是Apache组织开发的一个开源的日志记录框架,广泛应用于Java应用程序中。作为一款强大的日志处理工具,它提供了灵活的日志配置,允许开发者根据需求调整日志级别、格式和输出位置,极大...

Global site tag (gtag.js) - Google Analytics