2013-08-21 14 views
1

所以我在运行实用程序的MSBuild中有一个EXEC任务。该实用程序写入日志文件,但不会在stdout上生成输出。MSBuild错误任务,从文件中读取行,以及用于日志记录的自定义消息

如果出现错误(实用程序返回0以外的某个ReturnCode),我想抓取日志文件的内容并根据内容输出消息。

问题是日志文件很大,我只对它的一小部分感兴趣。我无法弄清楚如何提取这个小部分以包含在构建日志错误通知中。然而,重要的是人们要了解哪里出了问题,而不仅仅是出了什么问题。

文件格式是这样的,在一个错误的情况下:

Line1 
Line2 
Line3 
*** Something Bad Happened 
Details on something bad 
*** Run Failed 
LineX 
LineY 
LineZ 

所以我需要的是一种方法,只提取线,从三个星号开始第一行开始,继续以三个星号开头的下一行INCLUSIVE。我不需要担心这种情况,即有两行以三个星号开始,因为这种情况从未发生过。

这是甚至是远程可能的吗?如果是的话,我无法弄清楚这个魔法咒语。我愿意在短时间内解决这个问题,只需要用三个星号来抓住第一行,并且能够记录下这些内容,但是我真的很想得到整条线路。

+0

我甚至会接受一种方法,将三个星号中的所有行都带到文件末尾(包含)。我仍然无法弄清楚。我只是试图在构建日志中包含一点作为构建一部分运行的实用程序的日志文件,因此在不需要过多挖掘的情况下诊断错误就会更容易。 – pmbAustin

回答

1
<Target Name="LogError" Condition="$(ExitCode) != 0"> 
    <PropertyGroup> 
     <ErrorFile>foo.log</ErrorFile> 
     <ErrorRead>$([System.IO.File]::ReadAllText($(ErrorFile)))</ErrorRead> 
     <ErrorText>$([System.Text.RegularExpressions.Regex]::Match($(ErrorRead), '^\*\*\* [\s\S]*^\*\*\* .*', System.Text.RegularExpressions.RegexOptions.Multiline))</ErrorText> 
    </PropertyGroup> 
    <Error File="$(ErrorFile)" Text="$(ErrorText)" /> 
</Target> 
+0

谢谢,我会试试这个,让你知道它是怎么回事! – pmbAustin

相关问题