Временные метки в Ant журнале?

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

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

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

Ответ 1

Вы можете определить Ant macrodef, чтобы установить текущую временную метку, а затем вызвать макродед каждый раз, когда вам нужно ссылаться на него в файле build.xml

Следующий макроопределение задает метку времени для свойства (вы можете добавить атрибут в макродед, если вы хотите настроить его свойство):

<macrodef  name="set.timestamp">
  <sequential>
    <tstamp>
      <format property="current.time" pattern="MM/dd/yyyy hh:mm"/>
    </tstamp>
  </sequential>
</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 ознакомьтесь с документацией .

Ответ 2

Указанные свойства неизменяемы в 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>

Ответ 3

Попробуйте это

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

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

Ответ 4

Мне нравится решение macrodef, если оно более эффективно, чем целевое, но я использую "var unset = true" для принудительного сброса переменной, например:

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

Ответ 5

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