2009-08-07 2 views
10

Есть ли простой способ иметь регистратор Ant (по умолчанию или другой) добавить метку времени к каждому сообщению?Временные метки в журнале Ant?

Единственный способ, который я могу придумать, - использовать Log4jListenerи включить его настройки в метку времени. Или напишите собственный регистратор , который подклассифицирует DefaultLogger и записывает метку времени. Если есть лучший или более простой способ (желательно, не требуя, чтобы пользователи устанавливали новый файл jar в свой каталог Ant lib),

Мне было бы интересно услышать об этом.

ответ

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> 

Для получения дополнительной информации о муравьиных макродефах, посмотрите documentation.

+3

Это будет хранить временную метку в свойстве, поэтому все сообщения будут использоваться в одно и то же время. Хорошо в некоторых случаях, но бесполезно для, например, видя, какая часть сборки занимает слишком много времени.Поскольку ОП упоминает «временную метку для каждого сообщения», я на самом деле не думаю, что это правильный ответ на вопрос о намерении. –

+1

Я не уверен в этом Расмусе. Если вы повторно вызываете установленный макрос временной метки и сразу после этого дампа время, оно должно сбрасывать его соответствующим образом. – corsiKa

10

Указанные свойства неизменны в муравьином, вам нужно сделать что-то немного забавное здесь, иначе вы просто закончите тем, что снова и снова регистрируете одну и ту же метку времени.

Использование 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

Он печатает время входа и время выхода для каждой цели вместе с временем, затраченным для каждой цели в мс.

1

Посмотрите на этих регистраторов: http://ant.apache.org/manual/listeners.html (также один - org.apache.tools.ant.listener.ProfileLogger - упоминается в ответе перед моим). Но это, похоже, требует новой версии Ant.

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 /> 
Смежные вопросы