2009-08-07 13 views
10

Esiste un modo semplice per fare in modo che Ant logger (predefinito o altro) aggiunga un timestamp a ciascun messaggio?Timestamp nel registro Ant?

L'unico modo che posso pensare è utilizzare ilLog4jListener e le sue impostazioni includono il timestamp. Oppure scrivi un logger personalizzato che sottoclasse DefaultLogger e scrive il timestamp. Se c'è un modo migliore o più semplice (preferibilmente senza richiedere che gli utenti di installino un nuovo file jar nella loro directory Ant lib),

Sarei interessato a sentirlo.

risposta

6

È possibile definire un macrodef Ant per impostare il timestamp corrente, quindi chiamare il macrodef ogni volta che è necessario fare riferimento a esso per tutta la build.xml

Il seguente macrodef imposterà il timestamp a una proprietà (è possibile aggiungere un attributo al macrodef se si desidera personalizzare la proprietà imposta):

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

Poi da usare, basta accedere alla proprietà impostata dal macrodef di cui hai bisogno:

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

Per ulteriori informazioni su ant macrodefs, consulta lo documentation.

+3

Questo memorizzerà il timestamp in una proprietà, quindi tutti i messaggi condivideranno la stessa ora. Buono in alcuni casi, ma inutile per es. vedere quale parte di una build impiega troppo tempo.Dato che l'OP cita "un timestamp per ogni messaggio", in realtà non penso che questa sia una risposta corretta alla domanda di interesse. –

+1

Non sono così sicuro di quel Rasmus. Se si richiama ripetutamente la macro data/ora impostata e immediatamente dopo tale operazione, è necessario scaricarla in modo appropriato. – corsiKa

10

Dato che le proprietà sono immutabili nella formica, è necessario fare qualcosa di un po 'strano qui altrimenti si finisce semplicemente per registrare lo stesso timestamp più e più volte.

L'uso di antcall ti offre una nuova sessione che significa che puoi riutilizzare la proprietà, anche se è un po 'maldestra.

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

Se si utilizza Ant 1.8 quindi è possibile utilizzare locale che è molto più pulito

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

Ed ecco come si può utilizzare

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

Prova questo

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

Stampa il tempo di ingresso e il tempo di uscita per ciascun target insieme al tempo impiegato per ciascun obiettivo in ms.

3

mi piace la soluzione macrodef se effettivamente è più efficiente rispetto al target, ma io uso un "var unset = true" per forzare un reset della variabile, come:

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

utilizzo

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