【问题标题】:Eclipse Console - what are the rules that make stack traces clickable?Eclipse 控制台 - 使堆栈跟踪可点击的规则是什么?
【发布时间】:2011-07-11 02:45:25
【问题描述】:

我记录了很多东西,并注意到 Eclipse 控制台使 Java 堆栈跟踪可单击。异常被突出显示(转到“创建断点”对话框),文件名 + 编号也被突出显示(允许直接进入该行)。

我想知道是否可以格式化我的正常日志行,以便 Eclipse 控制台对它们执行相同的操作。一种可能的方法是让它们看起来像堆栈跟踪行,但为了尽可能多地保留信息,我想知道 Eclipse 用来检测这些行的确切规则,但是 Eclipse 3.6.2 相当大,所以它是一项艰巨的任务。

那么问题来了,什么在这里起作用的规则,以及在哪里定义它们?


编辑:logback 模式布局 sn-p 是 %msg \(%file:%line\)%n

【问题讨论】:

  • AFAIK,当 eclipse 检测到规范的 classnames 和 java filenames()(如(Thread.java:50))包围时,它会自动使其可点击。默认。我见过一些插件也可以让任何其他文件都可以点击。
  • 你知道在 Eclipse 的什么地方定义了吗?
  • 这也适用于 IntelliJ(对于实际在工作区中的源文件)

标签: java eclipse logging console


【解决方案1】:

如果您打印(filename:lineNumber),Eclipse 会将其转换为链接。

例子:

System.out.println("message (Hello.java:2)");

不知道有没有其他的规则或者在哪里定义的。

【讨论】:

    【解决方案2】:

    这个 sn-p 可能会有所帮助。它可以放在代码中的任何位置,并会在 Eclipse 控制台上打印一个“可点击”行:

    StackTraceElement s = Thread.currentThread().getStackTrace()[1];
    System.out.printf("%s.%s(%s:%s)%n", s.getClassName(), s.getMethodName(),
                s.getFileName(), s.getLineNumber());
    

    更新:

    这个问题有一个答案,其中可能包括您的问题的解决方案:

    Eclipse console: detect warning and error patterns and make them clickable


    开始吧:我们必须通过扩展点org.eclipse.ui.console.consolePatternMatchListeners 贡献org.eclipse.ui.console.IPatternMatchListenerDelegate 的实现。

    为堆栈跟踪中的异常和行号提供超链接的贡献在org.eclipse.jdt.debug.ui 插件中定义,实现类在同一个包中。

    规则是正则表达式,可以在贡献插件的plugin.xml中找到。

    【讨论】:

    • 感谢您的回答。不过,我还是想看看实际的规则。
    【解决方案3】:
    fullyQualifiedClassName.methodName(fileName:lineNumber)
    

    没有fullyQualifiedClassName,Eclipse 可能会选择错误的文件。 methodName 是匹配所必需的,但未使用——它可以是任何东西。

    【讨论】:

      【解决方案4】:

      那么问题来了,这里的规则是什么,它们是在哪里定义的?

      实际的正则表达式可以在这里找到:https://github.com/eclipse/eclipse.jdt.debug/blob/e7932c6319b3a96526134940ca57de0576e9607a/org.eclipse.jdt.debug.ui/plugin.xml#L3371

      归结为类似

      \(\w*\.java:\S*\)

      即只有括号内的部分匹配。 然后控制台将匹配委托给org.eclipse.jdt.debug.ui.JavaConsoleTracker,这是IPatternMatchListenerDelegate 的实现。这将创建相应的IHyperlink (JavaStackTraceHyperlink)。只有在点击链接时才会完成实际的解析,然后再次读取整行以获取完整的包名等,然后在工作区中进行搜索。


      如果像我这样的人需要在控制台之外实现此行为(例如使用StyledText):

      使用一些正则表达式匹配链接,添加相应的StyleRange(参见SWT.UNDERLINE_LINK)并将数据属性设置为链接数据。单击时,按包/类搜索工作区中的实际文件:

      SearchEngine search = new SearchEngine();
      NullProgressMonitor monitor = new NullProgressMonitor();
      TypeNameMatchRequestor collector = result -> {
          IPath path = result.getType().getPath();
          //handle result, e.g. open editor
      };
      search.searchAllTypeNames(fullPackageName, SearchPattern.R_EXACT_MATCH, className, IJavaSearchConstants.TYPE, IJavaSearchConstants.TYPE, SearchEngine.createWorkspaceScope(), collector, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, monitor);
      

      【讨论】:

        猜你喜欢
        • 2017-10-24
        • 1970-01-01
        • 2016-01-11
        • 2015-06-07
        • 2011-12-04
        • 1970-01-01
        • 2015-11-09
        • 2015-04-09
        • 1970-01-01
        相关资源
        最近更新 更多