<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<html>

<head>
<meta http-equiv="Content-Language" content="en-us">
<link rel="stylesheet" type="text/css" href="stylesheets/style.css">
<title>Listeners &amp; Loggers</title>
</head>

<body>
<h1>Listeners &amp; Loggers</h1>

<h2><a name="Overview">Overview</a></h2>

<p>Apache Ant has two related features to allow the build process to be monitored:
listeners and loggers.</p>

<h3><a name="Listeners">Listeners</a></h3>

<p>A listener is alerted of the following events:</p>

<ul>
  <li>build started</li>
  <li>build finished</li>
  <li>target started</li>
  <li>target finished</li>
  <li>task started</li>
  <li>task finished</li>
  <li>message logged</li>
</ul>

<p>
  These are used internally for various recording and housekeeping operations,
  however new listeners may registered on the command line through the <code>-listener</code>
  argument.
</p>

<h3><a name="Loggers">Loggers</a></h3>

<p>Loggers extend the capabilities of listeners and add the following features:</p>

<ul>
  <li>Receives a handle to the standard output and error print streams and
  therefore can log information to the console or the <code>-logfile</code> specified file.</li>
  <li>Logging level (-quiet, -verbose, -debug) aware</li>
  <li>Emacs-mode aware</li>
</ul>

<h2><a name="builtin">Built-in Listeners/Loggers</a></h2>

<table border="1" cellspacing="1" width="100%" id="AutoNumber1">
  <tr>
    <td width="33%">Classname</td>
    <td width="33%">Description</td>
    <td width="34%">Type</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#DefaultLogger">org.apache.tools.ant.DefaultLogger</a></code></td>
    <td width="33%">The logger used implicitly unless overridden with the
    <code>-logger</code> command-line switch.</td>
    <td width="34%">BuildLogger</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#NoBannerLogger">
    org.apache.tools.ant.NoBannerLogger</a></code></td>
    <td width="33%">This logger omits output of empty target output.</td>
    <td width="34%">BuildLogger</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#MailLogger">
    org.apache.tools.ant.listener.MailLogger</a></code></td>
    <td width="33%">Extends DefaultLogger such that output is still generated
    the same, and when the build is finished an e-mail can be sent.</td>
    <td width="34%">BuildLogger</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#AnsiColorLogger">
    org.apache.tools.ant.listener.AnsiColorLogger</a></code></td>
    <td width="33%">Colorifies the build output.</td>
    <td width="34%">BuildLogger</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#Log4jListener">
    org.apache.tools.ant.listener.Log4jListener</a></code></td>
    <td width="33%">
        Passes events to Apache Log4j for highly customizable logging.<br>
        <b>Deprecated:</b> Apache Log4j (1.x) is not developed any more. Last
        release is 1.2.17 from 26-May-2012 and contains vulnerability issues.
    </td>
    <td width="34%">BuildListener</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#XmlLogger">org.apache.tools.ant.XmlLogger</a></code></td>
    <td width="33%">Writes the build information to an XML file.</td>
    <td width="34%">BuildLogger</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#TimestampedLogger">org.apache.tools.ant.TimestampedLogger</a></code></td>
    <td width="33%">Prints the time that a build finished</td>
    <td width="34%">BuildLogger</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#BigProjectLogger">org.apache.tools.ant.listener.BigProjectLogger</a></code></td>
    <td width="33%">Prints the project name every target</td>
    <td width="34%">BuildLogger</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#SimpleBigProjectLogger">org.apache.tools.ant.listener.SimpleBigProjectLogger</a></code></td>
    <td width="33%">Prints the project name for subprojects only, otherwise like NoBannerLogger <em>Since Ant 1.8.1</em></td>
    <td width="34%">BuildLogger</td>
  </tr>
  <tr>
    <td width="33%"><code><a href="#ProfileLogger">org.apache.tools.ant.listener.ProfileLogger</a></code></td>
    <td width="33%">The default logger, with start times, end times and
    durations added for each task and target.</td>
    <td width="34%">BuildLogger</td>
  </tr>
</table>



<h3><a name="DefaultLogger">DefaultLogger</a></h3>
<p>Simply run Ant normally, or:</p>
<blockquote>
<p><code>ant -logger org.apache.tools.ant.DefaultLogger</code></p>
</blockquote>



<h3><a name="NoBannerLogger">NoBannerLogger</a></h3>
<p>Removes output of empty target output.</p>
<blockquote>
<p><code>ant -logger org.apache.tools.ant.NoBannerLogger</code></p>
</blockquote>



<h3><a name="MailLogger">MailLogger</a></h3>
<p>The MailLogger captures all output logged through DefaultLogger (standard Ant
output) and will send success and failure messages to unique e-mail lists, with
control for turning off success or failure messages individually.</p>

<p>Properties controlling the operation of MailLogger:</p>
<table border="1" cellspacing="1" width="100%" id="AutoNumber2">
  <tr>
    <th width="337">Property</th>
    <th width="63%">Description</th>
    <th width="63%">Required</th>
  </tr>
  <tr>
    <td width="337">MailLogger.mailhost </td>
    <td width="63%">Mail server to use</td>
    <td width="63%">No, default &quot;localhost&quot;</td>
  </tr>
  <tr>
    <td width="337">MailLogger.port </td>
    <td width="63%">SMTP Port for the Mail server</td>
    <td width="63%">No, default &quot;25&quot;</td>
  </tr>
  <tr>
    <td width="337">MailLogger.user</td>
    <td width="63%">user name for SMTP auth</td>
    <td width="63%">Yes, if SMTP auth is required on your SMTP server<br>
    the email message will be then sent using Mime and requires JavaMail</td>
  </tr>
  <tr>
    <td width="337">MailLogger.password</td>
    <td width="63%">password for SMTP auth</td>
    <td width="63%">Yes, if SMTP auth is required on your SMTP server<br>
    the email message will be then sent using Mime and requires JavaMail</td>
  </tr>
  <tr>
    <td width="337">MailLogger.ssl</td>
    <td width="63%">on or true if ssl is needed<br>
    This feature requires JavaMail</td>
    <td width="63%">
    no</td>
  </tr>
  <tr>
    <td width="337">MailLogger.from</td>
    <td width="63%">Mail &quot;from&quot; address</td>
    <td width="63%">Yes, if mail needs to be sent</td>
  </tr>
  <tr>
    <td width="337">MailLogger.replyto</td>
    <td width="63%">Mail &quot;replyto&quot; address(es), comma-separated</td>
    <td width="63%">No</td>
  </tr>
  <tr>
    <td width="337">MailLogger.failure.notify </td>
    <td width="63%">Send build failure e-mails?</td>
    <td width="63%">No, default &quot;true&quot;</td>
  </tr>
  <tr>
    <td width="337">MailLogger.success.notify </td>
    <td width="63%">Send build success e-mails?</td>
    <td width="63%">No, default &quot;true&quot;</td>
  </tr>
  <tr>
    <td width="337">MailLogger.failure.to </td>
    <td width="63%">Address(es) to send failure messages to, comma-separated</td>
    <td width="63%">Yes, if failure mail is to be sent</td>
  </tr>
  <tr>
    <td width="337">MailLogger.success.to </td>
    <td width="63%">Address(es) to send success messages to, comma-separated</td>
    <td width="63%">Yes, if success mail is to be sent</td>
  </tr>
  <tr>
    <td width="337">MailLogger.failure.cc </td>
    <td width="63%">Address(es) to send failure messages to carbon copy (cc), comma-separated</td>
    <td width="63%">No</td>
  </tr>
  <tr>
    <td width="337">MailLogger.success.cc </td>
    <td width="63%">Address(es) to send success messages to carbon copy (cc), comma-separated</td>
    <td width="63%">No</td>
  </tr>
  <tr>
    <td width="337">MailLogger.failure.bcc </td>
    <td width="63%">Address(es) to send failure messages to blind carbon copy (bcc), comma-separated</td>
    <td width="63%">No</td>
  </tr>
  <tr>
    <td width="337">MailLogger.success.bcc </td>
    <td width="63%">Address(es) to send success messages to blind carbon copy (bcc), comma-separated</td>
    <td width="63%">No</td>
  </tr>
  <tr>
    <td width="337">MailLogger.failure.subject </td>
    <td width="63%">Subject of failed build</td>
    <td width="63%">No, default &quot;Build Failure&quot;</td>
  </tr>
  <tr>
    <td width="337">MailLogger.success.subject </td>
    <td width="63%">Subject of successful build</td>
    <td width="63%">No, default &quot;Build Success&quot;</td>
  </tr>
  <tr>
    <td width="337">MailLogger.failure.body</td>
    <td width="63%">Fixed body of the email for a failed
      build.  <em>Since Ant 1.8.0</em></td>
    <td width="63%">No, default is to send the full log output.</td>
  </tr>
  <tr>
    <td width="337">MailLogger.success.body</td>
    <td width="63%">Fixed body of the email for a successful
      build.  <em>Since Ant 1.8.0</em></td>
    <td width="63%">No, default is to send the full log output.</td>
  </tr>
  <tr>
    <td width="337">MailLogger.mimeType</td>
    <td width="63%">MIME-Type of the message.  <em>Since Ant 1.8.0</em></td>
    <td width="63%">No, default is text/plain</td>
  </tr>
  <tr>
    <td width="337">MailLogger.charset</td>
    <td width="63%">Character set of the message.  <em>Since Ant 1.8.0</em></td>
    <td width="63%">No</td>
  </tr>
  <tr>
    <td width="337">MailLogger.starttls.enable</td>
    <td width="63%">on or true if STARTTLS should be supported
    (requires JavaMail).  <em>Since Ant 1.8.0</em></td>
    <td width="63%">No, default is false</td>
  </tr>
  <tr>
    <td width="337">MailLogger.properties.file </td>
    <td width="63%">Filename of properties file that will override other values.</td>
    <td width="63%">No</td>
  </tr>
</table>

<blockquote>
<p><code>ant -logger org.apache.tools.ant.listener.MailLogger</code></p>
</blockquote>



<h3><a name="AnsiColorLogger">AnsiColorLogger</a></h3>

<p>The AnsiColorLogger adds color to the standard Ant output
by prefixing and suffixing ANSI color code escape sequences to
it.  It is just an extension of <a href="#DefaultLogger">DefaultLogger</a>
and hence provides all features that DefaultLogger does.</p>
<p>AnsiColorLogger differentiates the output by assigning
different colors depending upon the type of the message.</p>
<p>If used with the -logfile option, the output file
will contain all the necessary escape codes to
display the text in colorized mode when displayed
in the console using applications like cat, more, etc.</p>
<p>This is designed to work on terminals that support ANSI
color codes.  It works on XTerm, ETerm, Win9x Console
(with ANSI.SYS loaded.), etc.</p>
<p><Strong>NOTE:</Strong>
It doesn't work on WinNT and successors, even when a COMMAND.COM console loaded with
ANSI.SYS is used.</p>
<p>If the user wishes to override the default colors
with custom ones, a file containing zero or more of the
custom color key-value pairs must be created.  The recognized keys
and their default values are shown below:</p><code><pre>
AnsiColorLogger.ERROR_COLOR=2;31
AnsiColorLogger.WARNING_COLOR=2;35
AnsiColorLogger.INFO_COLOR=2;36
AnsiColorLogger.VERBOSE_COLOR=2;32
AnsiColorLogger.DEBUG_COLOR=2;34</pre></code>
<p>Each key takes as value a color combination defined as
<b>Attribute;Foreground;Background</b>.  In the above example, background
value has not been used.</p>
<p>This file must be specified as the value of a system variable
named ant.logger.defaults and passed as an argument using the -D
option to the <b>java</b> command that invokes the Ant application.
An easy way to achieve this is to add -Dant.logger.defaults=
<i>/path/to/your/file</i> to the ANT_OPTS environment variable.
Ant's launching script recognizes this flag and will pass it to
the java command appropriately.</p>
<p>Format:</p><pre>
AnsiColorLogger.*=Attribute;Foreground;Background

Attribute is one of the following:
0 -&gt; Reset All Attributes (return to normal mode)
1 -&gt; Bright (Usually turns on BOLD)
2 -&gt; Dim
3 -&gt; Underline
5 -&gt; link
7 -&gt; Reverse
8 -&gt; Hidden

Foreground is one of the following:
30 -&gt; Black
31 -&gt; Red
32 -&gt; Green
33 -&gt; Yellow
34 -&gt; Blue
35 -&gt; Magenta
36 -&gt; Cyan
37 -&gt; White

Background is one of the following:
40 -&gt; Black
41 -&gt; Red
42 -&gt; Green
43 -&gt; Yellow
44 -&gt; Blue
45 -&gt; Magenta
46 -&gt; Cyan
47 -&gt; White</pre>

<blockquote>
<p><code>ant -logger org.apache.tools.ant.listener.AnsiColorLogger</code></p>
</blockquote>



<h3><a name="Log4jListener">Log4jListener</a></h3>
<p><b>Deprecated:</b> Apache Log4j (1) is not developed any more. Last
release is 1.2.17 from 26-May-2012 and contains vulnerability issues.</p>
<p>Passes build events to Log4j, using the full classname's of the generator of
each build event as the category:</p>
<ul>
  <li>build started / build finished - org.apache.tools.ant.Project</li>
  <li>target started / target finished - org.apache.tools.ant.Target</li>
  <li>task started / task finished - the fully qualified classname of the task</li>
  <li>message logged - the classname of one of the above, so if a task logs a
  message, its classname is the category used, and so on.</li>
</ul>
<p>All start events are logged as INFO.&nbsp; Finish events are either logged as
INFO or ERROR depending on whether the build failed during that stage. Message
events are logged according to their Ant logging level, mapping directly to a
corresponding Log4j level.</p>

<blockquote>
<p><code>ant -listener org.apache.tools.ant.listener.Log4jListener</code></p>
</blockquote>

<p>To use Log4j you will need the Log4j JAR file and a 'log4j.properties'
configuration file.  Both should be placed somewhere in your Ant
classpath. If the log4j.properties is in your project root folder you can
add this with <i>-lib</i> option:</p>

<blockquote>
<pre><code>ant -listener org.apache.tools.ant.listener.Log4jListener -lib .</code></pre>
</blockquote>

<p>If, for example, you wanted to capture the same information output to the
console by the DefaultLogger and send it to a file named 'build.log', you
could use the following configuration:</p>

<blockquote>
<pre><code>log4j.rootLogger=ERROR, LogFile
log4j.logger.org.apache.tools.ant.Project=INFO
log4j.logger.org.apache.tools.ant.Target=INFO
log4j.logger.org.apache.tools.ant.taskdefs=INFO
log4j.logger.org.apache.tools.ant.taskdefs.Echo=WARN

log4j.appender.LogFile=org.apache.log4j.FileAppender
log4j.appender.LogFile.layout=org.apache.log4j.PatternLayout
log4j.appender.LogFile.layout.ConversionPattern=[%6r] %8c{1} : %m%n
log4j.appender.LogFile.file=build.log
</code></pre>
</blockquote>

<p>For more information about configuring Log4J see <a href="http://logging.apache.org/log4j/docs/documentation.html">its
documentation page</a>.</p>

<h4>Using the Log4j 1.2 Bridge</h4>
You could use the <a href="http://logging.apache.org/log4j/2.x/log4j-1.2-api/index.html">Log4j Bridge</a>
if your application is written against the Log4j (1.x) API, but you want to use the Log4j 2.x runtime.
For using the bridge with Ant you have to add
<ul>
  <li>log4j-1.2-api-${log4j.version}.jar</li>
  <li>log4j-api-${log4j.version}.jar</li>
  <li>log4j-core-${log4j.version}.jar</li>
  <li>log4j2.xml</li>
</ul>
to your classpath (e.g. via the <code>-lib</code> option).
(For using the bridge Ant 1.9.10/1.10.2 or higher is required.)
Translating the 1.x properties file into the 2.x xml syntax would result in
<blockquote>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;Configuration status=&quot;WARN&quot;&gt;
  &lt;Appenders&gt;
    &lt;File name=&quot;file&quot; fileName=&quot;build.log&quot;&gt;
      &lt;PatternLayout&gt;
        &lt;Pattern&gt;[%6r] %8c{1} : %m%n&lt;/Pattern&gt;
      &lt;/PatternLayout&gt;
    &lt;/File&gt;
  &lt;/Appenders&gt;
  &lt;Loggers&gt;
    &lt;Root level=&quot;ERROR&quot;&gt;
      &lt;AppenderRef ref=&quot;file&quot; level=&quot;DEBUG&quot;/&gt;
    &lt;/Root&gt;
    &lt;Logger name=&quot;org.apache.tools.ant.Project&quot; level=&quot;INFO&quot;/&gt;
    &lt;Logger name=&quot;org.apache.tools.ant.Project&quot; level=&quot;INFO&quot;/&gt;
    &lt;Logger name=&quot;org.apache.tools.ant.taskdefs&quot; level=&quot;INFO&quot;/&gt;
    &lt;Logger name=&quot;org.apache.tools.ant.taskdefs.Echo&quot; level=&quot;WARN&quot;/&gt;
  &lt;/Loggers&gt;
&lt;/Configuration&gt;
</code></pre>
</blockquote>



<h3><a name="XmlLogger">XmlLogger</a></h3>
<p>Writes all build information out to an XML file named log.xml, or the value
of the <code>XmlLogger.file</code> property if present, when used as a
listener. When used as a logger, it writes all output to either the
console or to the value of <code>-logfile</code>. Whether used as a listener
or logger, the output is not generated until the build is complete, as it
buffers the information in order to provide timing information for task,
targets, and the project.</p>
<p>By default the XML file creates a reference to an XSLT file "log.xsl" in the current directory;
look in ANT_HOME/etc for one of these. You can set the property
<code>ant.XmlLogger.stylesheet.uri</code> to provide a uri to a style sheet.
this can be a relative or absolute file path, or an http URL.
If you set the property to the empty string, "", no XSLT transform
is declared at all.</p>

<blockquote>
<p><code>ant -listener org.apache.tools.ant.XmlLogger</code><br>
<code>ant -logger org.apache.tools.ant.XmlLogger -verbose -logfile build_log.xml</code></p>
</blockquote>



<h3><a name="TimestampedLogger">TimestampedLogger</a></h3>
<p>
  Acts like the default logger, except that the final success/failure message also includes
  the time that the build completed. For example:
</p>
<pre>
  BUILD SUCCESSFUL - at 16/08/05 16:24
</pre>
<p>To use this listener, use the command:</p>

<blockquote>
<code>ant  -logger org.apache.tools.ant.listener.TimestampedLogger</code>
</blockquote>



<h3><a name="BigProjectLogger">BigProjectLogger</a></h3>
<p>
  This logger is designed to make examining the logs of a big build easier,
  especially those run under continuous integration tools. It
</p>
<ol>
  <li>When entering a child project, prints its name and directory</li>
  <li>When exiting a child project, prints its name</li>
  <li>Includes the name of the project when printing a target</li>
  <li>Omits logging the names of all targets that have no direct task output</li>
  <li>Includes the build finished timestamp of the TimeStamp logger</li>
</ol>
<p>
  This is useful when using &lt;subant&gt; to build a large project
  from many smaller projects -the output shows which particular
  project is building. Here is an example in which "clean" is being called
  on all a number of child projects, only some of which perform work:
</p>
<pre>

======================================================================
Entering project "xunit"
In /home/ant/components/xunit
======================================================================

xunit.clean:
   [delete] Deleting directory /home/ant/components/xunit/build
   [delete] Deleting directory /home/ant/components/xunit/dist

======================================================================
Exiting project "xunit"
======================================================================

======================================================================
Entering project "junit"
In /home/ant/components/junit
======================================================================

======================================================================
Exiting project "junit"
======================================================================
</pre>

<p>
  The entry and exit messages are very verbose in this example, but in
  a big project compiling or testing many child components, the messages
  are reduced to becoming clear delimiters of where different projects
  are in charge -or more importantly, which project is failing.
</p>
<p>To use this listener, use the command:</p>
<blockquote>
<code>ant  -logger org.apache.tools.ant.listener.BigProjectLogger</code>
</blockquote>

<h3><a name="SimpleBigProjectLogger">SimpleBigProjectLogger</a></h3>
<p>Like <code>BigProjectLogger</code>, project-qualified target names are printed,
useful for big builds with subprojects.
Otherwise it is as quiet as <code>NoBannerLogger</code>:</p>
<pre>
Buildfile: /sources/myapp/build.xml

myapp-lib.compile:
Created dir: /sources/myapp/lib/build/classes
Compiling 1 source file to /sources/myapp/lib/build/classes

myapp-lib.jar:
Building jar: /sources/myapp/lib/build/lib.jar

myapp.compile:
Created dir: /sources/myapp/build/classes
Compiling 2 source files to /sources/myapp/build/classes

myapp.jar:
Building jar: /sources/myapp/build/myapp.jar

BUILD SUCCESSFUL
Total time: 1 second
</pre>
<p><b>since Ant 1.8.1</b></p>
<p>To use this listener, use the command:</p>
<blockquote>
<code>ant -logger org.apache.tools.ant.listener.SimpleBigProjectLogger</code>
</blockquote>

<h3><a name="ProfileLogger">ProfileLogger</a></h3>
<p>This logger stores the time needed for executing a task, target and the whole build and prints
these information. The output contains a timestamp when entering the build, target or task and a timestamp and the needed time when exiting.
</p>
<!-- This is the 'since' as described in the Loggers JavaDoc -->
<p><b>since Ant 1.8.0</b></p>
<h4>Example</h4>
Having that buildfile
<pre>
&lt;project&gt;
    &lt;target name=&quot;aTarget&quot;&gt;
        &lt;echo&gt;echo-task&lt;/echo&gt;
        &lt;zip destfile=&quot;my.zip&quot;&gt;
            &lt;fileset dir=&quot;${ant.home}&quot;/&gt;
        &lt;/zip&gt;
    &lt;/target&gt;
    &lt;target name=&quot;anotherTarget&quot; depends=&quot;aTarget&quot;&gt;
        &lt;echo&gt;another-echo-task&lt;/echo&gt;
    &lt;/target&gt;
&lt;/project&gt;
</pre>
and executing with <tt>ant -logger org.apache.tools.ant.listener.ProfileLogger anotherTarget</tt> gives that output (with other timestamps and duration of course ;) :
<pre>
Buildfile: ...\build.xml

Target aTarget: started Thu Jan 22 09:01:00 CET 2009

echo: started Thu Jan 22 09:01:00 CET 2009
     [echo] echo-task

echo: finished Thu Jan 22 09:01:00 CET 2009 (250ms)

zip: started Thu Jan 22 09:01:00 CET 2009
      [zip] Building zip: ...\my.zip

zip: finished Thu Jan 22 09:01:01 CET 2009 (1313ms)

Target aTarget: finished Thu Jan 22 09:01:01 CET 2009 (1719ms)

Target anotherTarget: started Thu Jan 22 09:01:01 CET 2009

echo: started Thu Jan 22 09:01:01 CET 2009
     [echo] another-echo-task

echo: finished Thu Jan 22 09:01:01 CET 2009 (0ms)

Target anotherTarget: finished Thu Jan 22 09:01:01 CET 2009 (0ms)

BUILD SUCCESSFUL
Total time: 2 seconds
</pre>



<h2><a name="dev">Writing your own</a></h2>

<p>See the <a href="develop.html#buildevents">Build Events</a> section for
developers.</p>

<p>Notes:</p>

<ul>
  <li>
    A listener or logger should not write to standard output or error in the <code>messageLogged()</code> method;
    Ant captures these internally and it will trigger an infinite loop.
  </li>
  <li>
    Logging is synchronous; all listeners and loggers are called one after the other, with the build blocking until
    the output is processed. Slow logging means a slow build.
  </li>
  <li>When a build is started, and <code>BuildListener.buildStarted(BuildEvent event)</code> is called,
    the project is not fully functional. The build has started, yes, and the <code>event.getProject()</code> method call
    returns the Project instance, but that project is initialized with JVM and ant properties, nor has it
    parsed the build file yet. You cannot call <code>Project.getProperty()</code> for property lookup, or
    <code>Project.getName()</code> to get the project name (it will return null).
  </li>
  <li>
    Classes that implement <code>org.apache.tools.ant.SubBuildListener</code> receive notifications when child projects
    start and stop.
  </li>
</ul>

</body>
</html>
