我试图做一些自动解析Java异常和堆栈跟踪被发送到我们的中央服务器(用C#编写)。我现在有一个算法正在工作,它将堆栈跟踪解析为标准表示,并在此过程中尝试确定生成异常的语言环境,但只对英语进行了测试,并且还想验证其他语言环境。在不同的语言环境中的Java堆栈跟踪
更具体的堆栈跟踪的每一行,似乎是这样的大致格式:
...
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
...
在“在”似乎是具体的语言环境,其余的是格式非常通用。我正在寻找一种简单的方法来获取这些特定于语言区域的分隔词,而不需要我将区域设置切换到我能想到的所有可能的语言。
我不是java的智者,所以我想知道是否可以找到/下载一些资源,指定不同语言环境中的分隔词,或者是否有其他明显的方法让我的生活更轻松(至少对于这个小任务)?
更新:只是要清楚,我没有真正的问题解析线获取方法名/类名和文件名/ linenumber,如果他们可用。我正在寻找的是开始单词列表,其中'at'是英语单词(如上所示)。我在想,这些字符串可能出现在某个语言包或某个资源文件中,但不是一个我不知道该去哪里看的java人。
另一个更新: 尝试下面的代码,这似乎表明,“在”字是对所有区域相同的(如果Locale.setLocale法是正确的调用)
public static void main(String[] args) {
Locale[] locs = Locale.getAvailableLocales();
for(Locale l:locs)
{
System.out.println(l.getDisplayName());
Locale.setDefault(l);
GetAndPrintException();
}
}
private static void GetAndPrintException() {
try
{
throw new RuntimeException("BOOM!");
}
catch(RuntimeException exc)
{
StringWriter stringWrite = new StringWriter();
PrintWriter printWrite = new PrintWriter(stringWrite);
exc.printStackTrace(printWrite);
printWrite.flush();
printWrite.close();
System.out.println(stringWrite.toString());
}
}
此代码为列表中的所有语言环境打印出相同的堆栈跟踪,没有针对跟踪的特定于语言环境的更改。如果这是正确的和预期的,那么似乎我可以认为从世界各地收到的Java堆栈跟踪将始终使用英文格式。这是一个正确的假设吗?
哇,这是奇怪的 - 我从来没有见过本地化的stacktraces(和我'在德国和日本的区域设置工作) – 2010-02-01 10:04:03
@迈克尔:从我上次测试(见更新)确实似乎没有本地化发生在不同的语言环境的堆栈跟踪。你能从你的经历中验证这种行为吗? – 2010-02-01 10:29:47
我认为McDowell是正确的:您不应该依赖printStackTrace()生成的堆栈跟踪的格式 - 如果可能的话,您的应用程序会发送StackTraceElement []的序列化实例,从而无需完全解析。 – 2010-02-01 10:46:37