Ant日志中的时间戳?

时间:2009-08-07 18:13:38

标签: java ant timestamp

是否有一种简单的方法可以让Ant记录器(默认或其他)添加 每条消息的时间戳?

我能想到的唯一方法就是使用 Log4jListener并将其设置包括时间戳。或写一个 自定义记录器,它是DefaultLogger的子类并写入时间戳。 如果有更好或更简单的方法(最好不要求那样) 用户将新的jar文件安装到他们的Ant lib目录中,

我有兴趣听到它。

5 个答案:

答案 0 :(得分:10)

鉴于属性在ant中是不可变的,你需要做一些有点时髦的事情,否则你最终会一次又一次地记录相同的时间戳。

使用antcall会为您提供一个全新的会话,这意味着您可以重复使用该属性,尽管它有点笨拙。

<macrodef name="timestamp.echo"> 
  <attribute name="message"/>    
  <sequential> 
    <antcall target="_timestamp.echo">
        <param name="message" value="@{message}" />
    </antcall>
  </sequential> 
</macrodef>  


<target name="_timestamp.echo"> 
   <tstamp> 
    <format property="current.time" pattern="dd/MM/yyyy hh:mm:ss"/> 
   </tstamp>          
   <echo message="${current.time} ${message}"/> 
</target>

如果您使用的是Ant 1.8,那么您可以使用更清晰的本地

<macrodef name="timestamp.echo"> 
  <attribute name="message"/>    
  <sequential> 
   <local name="current.time" />
   <tstamp> 
    <format property="current.time" pattern="dd/MM/yyyy hh:mm:ss"/> 
   </tstamp>          
   <echo message="${current.time} @{message}" />
  </sequential> 
</macrodef>  

以下是如何使用它

<target name="testTsEcho" depends="init" description="blah">
    <timestamp.echo message="test" />
    <sleep seconds="10" />
    <timestamp.echo message="test2" />
</target>

答案 1 :(得分:7)

试试这个

ant -logger org.apache.tools.ant.listener.ProfileLogger

它打印每个目标的进入时间和退出时间以及每个目标所用的时间(毫秒)。

答案 2 :(得分:6)

您可以定义一个Ant宏定义来设置当前时间戳,然后每次需要在整个build.xml中引用它时调用macrodef

以下macrodef将时间戳设置为属性(如果要自定义其设置的属性,可以向macrodef添加属性):

<macrodef  name="set.timestamp">
  <sequential>
    <tstamp>
      <format property="current.time" pattern="MM/dd/yyyy hh:mm"/>
    </tstamp>
  </sequential>
</macrodef>

然后使用它,只需根据需要访问macrodef设置的属性:

<target name="doFoo" depends="dir.check" if="dir.exists">
  <set.timestamp/>
  <!--in this example, just echo the timestamp -->
  <echo message="${current.time}"/>
</target>

有关ant macrodef的更多信息,请查看documentation

答案 3 :(得分:3)

我喜欢macrodef解决方案,如果它确实比目标解决方案更有效,但我使用“var unset = true”强制重置变量,如:

<macrodef name="echoTimestamp">
    <sequential>
        <var name="current.time" unset="true"/>
        <tstamp>
            <format property="current.time" pattern="yyyy-MM-dd HH:mm:ss" />
        </tstamp>
        <echo message="${current.time}" />
    </sequential>
</macrodef> <!-- end echoTimestamp -->

使用

<echoTimestamp />
<sleep seconds="3"/>
<echoTimestamp />

答案 4 :(得分:1)

看看这些记录器:http://ant.apache.org/manual/listeners.html(也是一个 - org.apache.tools.ant.listener.ProfileLogger - 在我之前的答案中提到)。但这似乎需要一个足够新的Ant版本。