我记录了很多东西,并注意到Eclipse Console使Java堆栈跟踪可点击。异常突出显示(转到“创建断点”对话框),文件名+数字也会突出显示(允许直接转到该行)。
我想知道我是否可以格式化我的正常日志行,以便Eclipse Console对他们做同样的事情。一种可能的方法可能是使它们看起来像堆栈跟踪线,但为了保留尽可能多的信息,我想知道Eclipse用来检测这些行的确切规则,但Eclipse 3.6.2相当大,所以它是一项艰巨的任务。
问题是, 是什么在这里发挥作用, 是在哪里定义的?
编辑:回溯模式布局代码段为%msg \(%file:%line\)%n
答案 0 :(得分:9)
此代码段可能有所帮助。它可以放在代码中的任何位置,并在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.IPatternMatchListenerDelegate
提供org.eclipse.ui.console.consolePatternMatchListeners
的实施。
在org.eclipse.jdt.debug.ui
插件中定义了为堆栈跟踪中的异常和行号提供超链接的贡献,实现类在同一个包中。
规则是正则表达式,可以在贡献插件的plugin.xml
中找到。
答案 1 :(得分:3)
如果您打印(filename:lineNumber)
,Eclipse会将其转换为链接。
示例:
System.out.println("message (Hello.java:2)");
我不知道是否有其他规则或定义它们的位置。
答案 2 :(得分:1)
然后的问题是,这里的规则是什么?它们在哪里定义?
实际的正则表达式可以在这里找到: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
):
使用某些正则表达式匹配链接,并在数据中将data属性设置为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);
答案 3 :(得分:0)
fullyQualifiedClassName.methodName(fileName:lineNumber)
如果没有fullyQualifiedClassName
,Eclipse可能会选择错误的文件。 <{1}}是匹配但未使用所必需的 - 它可以是任何东西。