Java堆栈跟踪在不同的语言环境中

时间:2010-02-01 09:07:59

标签: java localization stack-trace

我正在尝试对java异常进行一些自动解析,并将堆栈跟踪发送到我们的中央服务器(用c#编写)。我现在有一个算法工作,它将堆栈跟踪解析为标准表示,并在此过程中尝试确定生成异常的语言环境,但仅在英语上测试,并且还想验证其他语言环境。

更具体地说,堆栈跟踪中的每一行似乎都大致如下格式:

    ...
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    ...

其中'at'似乎是特定于语言环境的,其余的格式非常通用。我正在寻找一种简单的方法来获取这些特定于语言环境的分隔符,这些单词不需要我将区域设置切换到我能想到的所有可能的语言。

我不是java wiz,所以我想知道我是否可以找到/下载一些资源来指定来自不同语言环境的分隔符,或者是否还有其他明显的方法可以让我的生活变得更轻松(至少对于这个小任务而言) ?

更新:为了清楚起见,我在解析行以获取methodname / classname和文件名/ linenumber(如果它们可用)时没有任何问题。我要找的是起始单词列表,其中'at'是英语单词(如上所示)。我认为这些字符串可能出现在某个地方的“语言包”或资源文件中,但不是一个我不知道在哪里看的java人。

另一个更新: 试过以下代码,似乎表明所有语言环境的'at'字是相同的(如果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将始终用英语格式化。这是正确的假设吗?

1 个答案:

答案 0 :(得分: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());
}