java - Ant 将堆栈跟踪放入标准输出中

标签 java logging ant stderr

我正在使用 Ant 以及我自己创建的任务。 当这些自定义 ant 任务失败时,它们的输出将重定向到 stdout。

我希望它们被重定向到 stderr。

一个简单的完整通用 Ant 示例是:

<project name="test" default="init" basedir=".">

    <!-- Initialise project parameters -->
    <target name="init">
          <echo message="This is error message." level="error" />
    </target>
</project>

它正确地将“这是错误消息”输出到 stderr,如下所示:

Buildfile: /home/jll/Downloads/loggingerror.xml

init:
     [echo] Something wrong here.
     **[echo] This is error message.**

BUILD SUCCESSFUL
Total time: 0 seconds

粗体行在 Eclipse 中显示为红色,表示它位于错误标准输出中。

现在,当我运行自定义 ant 文件时:

<project name="test2" default="init" basedir=".">
    <taskdef resource="resource/customtasks.properties" />
    <target name="init" >

        <log
            scriptid="S4"
            message="Initialising Project Parameters."
            min="0"
            max="5"/>
    </target>
</project>

运行此命令预计会失败并出现 NullPointerException。

输出确实按预期显示:

Trying to override old definition of task import

init:
      [log] java.lang.NullPointerException
      .......
      [log]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
      [log]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      [log]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      [log]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      [log]     at java.lang.reflect.Method.invoke(Method.java:606)
      [log]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
      [log]     at org.apache.tools.ant.Task.perform(Task.java:348)
      [log]     at org.apache.tools.ant.Target.execute(Target.java:435)
      [log]     at org.apache.tools.ant.Target.performTasks(Target.java:456)
      [log]     at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
      [log]     at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
      [log]     at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
      [log]     at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
      [log]     at org.apache.tools.ant.Main.runBuild(Main.java:851)
      [log]     at org.apache.tools.ant.Main.startAnt(Main.java:235)
      [log]     at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
      [log]     at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

BUILD SUCCESSFUL
Total time: 0 seconds

但在这种情况下,一切都转到标准输出。为什么?

在自定义任务中抛出异常的 Java 代码非常简单:

@Override
public void execute() throws BuildException {
    try {
        stuff....
    }
    catch (Exception e) {
        throw new BuildException(e);
    }
}

我也一直在尝试在我的java代码中摆弄e.printStackTrace()logger.error("message", e),到目前为止没有成功。即使显示错误,行为也保持不变(所有内容都发送到标准输出)。

有什么方法可以看到我的堆栈跟踪显示,或者至少在 stderr 中看到某种错误消息?

谢谢

最佳答案

我认为这是不可能的。

如果您没有太多类,最接近的解决方案是通过执行类似于所描述的操作,将每个类的输出重定向到文件(stderr) here.

但是他们也想重定向标准输出,但你可以尝试这个:

<java classname="some.package.Class" output="stderr.txt"> ... </java>

然而,这并没有真正将其定向到 stderr,但它已经很接近了。

关于java - Ant 将堆栈跟踪放入标准输出中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30654836/

相关文章:

haskell - 通过haskell元编程提取用于跟踪/记录的上下文

javascript - 如何借助 Ant Mail Task 在 HTML Body 部分中以纯文本形式发送邮件

java - 是否可以使用与默认序列不同的 Spring Batch 序列?

java - ArrayList 初始化为 null?

java - Redisson 中仅使用参数化构造函数的类的对象反序列化

javascript - 默认情况下, Node console.log 会 chop 输出。我怎样才能看到完整的输出?

java - 通过Runnable任务获取自定义Thread的属性

logging - 如何在 Flink 作业执行期间记录未捕获的异常

java - ANT Jenkins 单元测试 - 计算失败的测试

java - 运行 JUnit : Fixing in build. xml 时出错