Временные метки в 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.