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