Java Ant日志中的时间戳?

Java Ant日志中的时间戳?,java,ant,timestamp,Java,Ant,Timestamp,有没有一种简单的方法让Ant logger(默认或其他)添加 每条消息的时间戳 我能想到的唯一办法就是使用 Log4jListener,其设置包括时间戳。或者写一封信 自定义记录器,它是DefaultLogger的子类并写入时间戳。 如果有更好或更简单的方法(最好不需要 用户将一个新的jar文件安装到他们的Ant-lib目录中) 我很想听听它。您可以定义一个Ant macrodef来设置当前的时间戳,然后每次需要在build.xml中引用它时调用macrodef 以下宏定义将为属性设置时间戳(如

有没有一种简单的方法让Ant logger(默认或其他)添加 每条消息的时间戳

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


我很想听听它。

您可以定义一个Ant macrodef来设置当前的时间戳,然后每次需要在build.xml中引用它时调用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宏定义的更多信息,请查看。

给定的属性在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>

如果您使用的是Ant1.8,那么您可以使用更干净的local

<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>

试试这个

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


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

看看这些记录器:(还有一个-org.apache.tools.ant.listener.ProfileLogger-在我之前的回答中提到)。但这似乎需要一个足够新的Ant版本。

如果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 -->

用法



这将在属性中存储时间戳,因此所有消息将共享同一时间。在某些情况下很好,但对于查看构建的哪个部分花费的时间太长来说是无用的。由于OP提到“每条消息都有一个时间戳”,我实际上不认为这是对intendet问题的正确答案。我不太确定Rasmus。如果反复调用set timestamp宏,并在转储时间之后立即转储,则它应适当地转储该时间。
<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 />