`

log4j 获取行号

    博客分类:
  • j2se
 
阅读更多
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.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教程PDF

    ### Log4J 教程详解 #### Log4j 概述 Log4j 是一个流行的开源日志框架,被广泛应用于 Java 应用程序中。它由 Apache 软件基金会维护,因其高度的灵活性、丰富的功能以及易于配置等特点而备受青睐。与传统的 `System...

    log4j日志框架

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

Global site tag (gtag.js) - Google Analytics