2010-02-01 72 views
1

我试图做一些自动解析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堆栈跟踪将始终使用英文格式。这是一个正确的假设吗?

+0

哇,这是奇怪的 - 我从来没有见过本地化的stacktraces(和我'在德国和日本的区域设置工作) – 2010-02-01 10:04:03

+0

@迈克尔:从我上次测试(见更新)确实似乎没有本地化发生在不同的语言环境的堆栈跟踪。你能从你的经历中验证这种行为吗? – 2010-02-01 10:29:47

+0

我认为McDowell是正确的:您不应该依赖printStackTrace()生成的堆栈跟踪的格式 - 如果可能的话,您的应用程序会发送StackTraceElement []的序列化实例,从而无需完全解析。 – 2010-02-01 10:46:37

回答

3

据我所知,“at”前缀从不翻译。

这是不太可能改变,但具体format of the stack trace没有规定:

此信息的格式取决于实现

如果你有过怎样的堆栈中的任何控制跟踪编组从JVM,你可以创建一个不太模糊的形式:

java.lang.Throwable e = ... 
StackTraceElement[] trace = e.getStackTrace(); 
for (StackTraceElement element : trace) { 
    System.out.println(element.getClassName()); 
    System.out.println(element.getMethodName()); 
    System.out.println(element.getFileName()); 
    System.out.println(element.getLineNumber()); 
}