不同地区的Java stacktrace

不同地区的Java stacktrace,java,localization,stack-trace,Java,Localization,Stack Trace,我试图对发送到中央服务器(用c#编写)的java异常和堆栈跟踪进行一些自动解析。我现在有一个算法正在工作,它将stacktraces解析为一个标准表示,并在这个过程中尝试确定生成异常的区域设置,但只在英语上进行了测试,并且希望对其他区域设置进行验证 更具体地说,stacktrace中的每一行的格式大致如下: ... at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.F

我试图对发送到中央服务器(用c#编写)的java异常和堆栈跟踪进行一些自动解析。我现在有一个算法正在工作,它将stacktraces解析为一个标准表示,并在这个过程中尝试确定生成异常的区域设置,但只在英语上进行了测试,并且希望对其他区域设置进行验证

更具体地说,stacktrace中的每一行的格式大致如下:

    ...
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    ...
其中“at”似乎是特定于语言环境的,而其余的则是非常通用的格式。我正在寻找一种获取这些特定于语言环境的分隔词的简单方法,这种方法不需要我将区域设置切换到我能想到的所有可能的语言

我不是java高手,所以我想知道我是否可以找到/下载一些资源来指定不同地区的分隔词,或者是否有其他明显的方法让我的生活更轻松(至少对于这个小任务)

更新:只是想澄清一下,我在解析行以获取methodname/classname和filename/linenumber(如果它们可用)时没有实际问题。我要找的是起始词列表,其中“at”是英语单词(如上所示)。我认为这些字符串可能会出现在“语言包”或某个资源文件中,但作为一个java人,我真的不知道该去哪里找

另一更新: 尝试了以下代码,该代码似乎表明“at”字对于所有语言环境都是相同的(如果Locale.setLocale-method是正确的调用)


这段代码为列表中的所有语言环境打印相同的stacktrace,对跟踪没有特定于语言环境的更改。如果这是正确的,并且是预期的,那么我似乎可以假设从世界各地收到的java stacktraces将始终使用英语格式化。这是一个正确的假设吗?

据我所知,“at”前缀从未翻译过

不太可能发生变化,但没有具体说明:

此信息的格式取决于实施情况

如果您可以控制如何从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());
}

哇,这太奇怪了-我从未见过本地化的stacktraces(我在德国和日本地区工作过)@Michael:从我上次的测试(见更新)来看,似乎不同地区的stacktraces上确实没有本地化。你能从你的经验中验证这个行为吗?我认为McDowell是对的:你不应该依赖printStackTrace()生成的堆栈跟踪的格式-如果可能的话,让你的应用程序发送StackTraceElement[]的序列化实例,从而完全消除解析的需要。
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());
}