2009-08-07 8 views
10

Czy istnieje prosty sposób, aby rejestrator Ant (domyślny lub inny) dodawał do każdej wiadomości znacznik czasu ?Znaczniki czasu w dzienniku Ant?

Jedynym sposobem, jaki mogę wymyślić jest użycie Log4jListener i jego ustawienia obejmują znacznik czasu. Lub napisz niestandardowy program rejestrujący , który podklasy DefaultLogger i zapisuje znacznik czasu. Jeśli istnieje lepszy lub łatwiejszy sposób (najlepiej bez konieczności instalowania nowego pliku jar w katalogu Ant lib),

Chciałbym się o tym dowiedzieć.

Odpowiedz

6

Można zdefiniować Ant macrodef ustawić aktualny timestamp, następnie wywołać macrodef za każdym razem trzeba odwoływać się do niej w całej build.xml

Poniższy macrodef ustawia znacznik czasu do nieruchomości (można dodać atrybut do macrodef jeśli chcesz dostosować właściwość to zestawy):

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

Potem go używać, tylko dostęp do właściwości ustawiony przez macrodef jak trzeba:

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

Aby uzyskać więcej informacji na temat makrodefs ant, sprawdź documentation.

+3

Spowoduje to zapisanie znacznika czasu w usłudze, dzięki czemu wszystkie wiadomości zostaną udostępnione w tym samym czasie. Dobry w niektórych przypadkach, ale bezużyteczny dla np. sprawdzanie, która część kompilacji trwa zbyt długo.Ponieważ PO wspomina o "sygnaturze czasowej każdej wiadomości", nie sądzę, że jest to poprawna odpowiedź na pytanie intendenta. –

+1

Nie jestem taki pewien o tym Rasmus. Jeśli wielokrotnie wywołujesz ustawione makro znacznika czasu i zaraz po tym czasie zrzucisz czas, powinien on go odpowiednio zrzucić. – corsiKa

10

Podane właściwości są niezmienne w mrówce, musisz zrobić coś nieco funky tutaj inaczej po prostu skończy się rejestrowanie tego samego znacznika czasu ponownie.

Używanie antcall daje ci nową sesję, co oznacza, że ​​możesz ponownie wykorzystać nieruchomość, chociaż jest trochę niezgrabna.

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

Jeśli używasz Ant 1.8, można korzystać z lokalnej, która jest znacznie czystsze

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

A oto w jaki sposób można go używać

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

Spróbuj

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

Wypisuje czas wejścia i czas wyjścia dla każdego celu wraz z czasem potrzebnym na każdy cel w ms.

3

I jak macrodef roztworu, jeśli rzeczywiście jest to bardziej efektywne niż cel jeden, ale użyć „var wyłączony = true” wymusić wyzerowanie zmiennych, jak:

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

użycia

<echoTimestamp /> 
<sleep seconds="3"/> 
<echoTimestamp /> 
Powiązane problemy