2009-08-07 150 views
10

有沒有簡單的方法讓Ant記錄器(默認或其他)爲每條消息添加一個 時間戳?Ant日誌中的時間戳?

我能想到的唯一方法是使用Log4jListener的 並且其設置包括時間戳。或者編寫一個 自定義記錄器,該記錄器的子類爲DefaultLogger並寫入時間戳記。 如果有更好或更簡單的方法(最好不要求 用戶在他們的Ant lib目錄中安裝一個新的jar文件),

我有興趣聽到它。

回答

6

您可以定義一個Ant macrodef設置當前的時間戳,然後調用macrodef每次需要引用它整個的build.xml

以下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 macrodefs的更多信息,請查看documentation

+3

這會將時間戳存儲在一個屬性中,所以所有的消息將共享同一時間。在某些情況下很好,但對例如看到構建的哪一部分需要很長時間。由於OP提到「每封郵件的時間戳」,實際上我並不認爲這是對問題的正確答案。 – 2012-03-20 12:16:20

+1

我對拉斯穆斯不太確定。如果您反覆調用設置的時間戳宏,並且在轉儲該時間之後,它應該適當地轉儲它。 – corsiKa 2013-03-11 23:11:26

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

試試這個

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

它將每個目標的輸入時間和退出時間以及每個目標的時間(以毫秒爲單位)打印出來。

3

我喜歡macrodef解決方案,如果的確是比目標一個更有效,但我用的是「無功未設置=真」給力變量的重置,如:

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