有沒有簡單的方法讓Ant記錄器(默認或其他)爲每條消息添加一個 時間戳?Ant日誌中的時間戳?
我能想到的唯一方法是使用Log4jListener的 並且其設置包括時間戳。或者編寫一個 自定義記錄器,該記錄器的子類爲DefaultLogger並寫入時間戳記。 如果有更好或更簡單的方法(最好不要求 用戶在他們的Ant lib目錄中安裝一個新的jar文件),
我有興趣聽到它。
有沒有簡單的方法讓Ant記錄器(默認或其他)爲每條消息添加一個 時間戳?Ant日誌中的時間戳?
我能想到的唯一方法是使用Log4jListener的 並且其設置包括時間戳。或者編寫一個 自定義記錄器,該記錄器的子類爲DefaultLogger並寫入時間戳記。 如果有更好或更簡單的方法(最好不要求 用戶在他們的Ant lib目錄中安裝一個新的jar文件),
我有興趣聽到它。
您可以定義一個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。
鑑於屬性在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>
試試這個
ant -logger org.apache.tools.ant.listener.ProfileLogger
它將每個目標的輸入時間和退出時間以及每個目標的時間(以毫秒爲單位)打印出來。
看看這些記錄器:http://ant.apache.org/manual/listeners.html(還有一個 - org.apache.tools.ant.listener.ProfileLogger - 在我的答案中提到)。但是這似乎需要一個足夠新的Ant版本。
我喜歡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 />
這會將時間戳存儲在一個屬性中,所以所有的消息將共享同一時間。在某些情況下很好,但對例如看到構建的哪一部分需要很長時間。由於OP提到「每封郵件的時間戳」,實際上我並不認爲這是對問題的正確答案。 – 2012-03-20 12:16:20
我對拉斯穆斯不太確定。如果您反覆調用設置的時間戳宏,並且在轉儲該時間之後,它應該適當地轉儲它。 – corsiKa 2013-03-11 23:11:26