当方法生成 std​​err 时,如何将信息添加到 STDERR?

Posted

技术标签:

【中文标题】当方法生成 std​​err 时,如何将信息添加到 STDERR?【英文标题】:How do I prepend information to STDERR when a method generates stderr? 【发布时间】:2009-06-23 19:09:51 【问题描述】:

当方法生成对 STDERR 的写入时,我有什么方法可以捕获吗? 我正在尝试在每次 STDERR 写入时预先添加一些信息。

假设我们的方法是:

parser.thatGeneratesSTDERR();

它会生成类似

的东西

第 37:29 行在字符“a”处没有可行的替代方案

我可以用一些可以捕获要写入的标准错误的东西来包装它并预先挂起一些吗 信息,所以它看起来像这样:

文件:mybadfile.txt -- 第 37:29 行在字符“a”处没有可行的替代方案

我知道我可能会深入研究编写 STDERR 的实际代码,但我真的不想这样做——我宁愿只是围绕这个方法包装一些代码。

我应该注意,这个方法并不总是生成 STDERR——我试图捕捉它们的原因是它不应该生成任何 STDERR——但是因为它在相当多的文件上被调用(超过40) 我永远不知道是哪个文件生成了错误消息——它需要很长时间才能找到。

更新 所以是的,我们可以更改我们的 STDERR——我只是忘记了我需要在我的新 STDERR 中覆盖我的 println ......这是相关代码:

public static String errfile = "";

static 
  final PrintStream currentErr = System.err;
  PrintStream newErr = new PrintStream(currentErr)
   
    public void println(String string) 
      print("File: " + errfile + " --");
      print(string);
      super.println();
    
  ;

  System.setErr(newErr);

然后对于我正在测试的每个文件,我所要做的就是将 errfile 更改为文件名,然后我的输出就会出现预期...

非常感谢!

【问题讨论】:

我不确定这是否是使 PrintStream 最终化的好习惯。 - 你的代码中似乎也有一些错误,因为我无法让它工作。 【参考方案1】:

鉴于 System.setErr 的工作原理,我不确定这是否可行。

我会创建一个新的类来扩展打印流并覆盖添加您的评论的方法。然后将错误流设置为新的打印流。不要从这个新类中调用 System.err.printxxx。

前...

class PrependPrintStream extends PrintStream 

PrependPrintStream(PrintStream ps, String pre)...
...
public void print(boolean b) 
super.print(this.pre);
super.print(b);

...

我查看了 sun 的 PrintStream impl,看起来所有 printxxx 委托都写入(String)是私有的而不是受保护的。我猜你可以复制/粘贴代码。

编辑::

很多更好的解决方案是使用 Logging 而不是 System.err。这允许您关闭和打开您的语句,并允许您创建自定义错误处理程序。您的特定处理程序可以在打印到 System.err 之前将您希望的语句添加到字符串中。这还有一个优点,即只有使用特定记录器的语句才会有前置文本,而对 System.err 的其他调用则不会。

【讨论】:

yeh.. 不幸的是,我什至没有考虑深入研究记录到 stderr 的代码.. 我只是希望它被覆盖并且它现在可以工作 - thnx【参考方案2】:

听起来您可能想看看面向方面的编程 (AOP)。使用 AOP,您可以为正在调用的解析器创建代理。在调用 thatGeneratesSTDERR() 方法之前,您可以让它调用您调用。从您的通话中,您可以输出您想要的信息。

请注意,了解 AOP 的工作原理可能需要阅读一些内容。

AspectJ - http://www.eclipse.org/aspectj/

AOP 联盟 - http://sourceforge.net/projects/aopalliance

【讨论】:

【参考方案3】:

您可以使用System.setErr 将stderr 重定向到您自己的PrintStream。

【讨论】:

以上是关于当方法生成 std​​err 时,如何将信息添加到 STDERR?的主要内容,如果未能解决你的问题,请参考以下文章

当他们使用 WooCommerce 进行购买时,如何将客户帐单信息添加到 MailChimp 组

使用 std::vector 时如何将索引信息传递给元素构造函数?

将安全标头信息添加到从 WSDL 生成的 Java 代码

Django 发生错误时如何将用户信息添加到 Sentry 的报告中?

Qt中如何将信息保存到文本文件并且保留原来的信息,比如在原来的文本文件中添加一行信息。

重定向请求时生成 ERR_HTTP_HEADERS_SENT 错误