# Loggers & Listeners

## Overview

NAnt has two related features to allow the build process to be monitored: listeners and loggers.

### Listeners

A listener is alerted of the following events:

- build started
- build finished
- target started
- target finished
- task started
- task finished
- message logged

### Loggers

Loggers extend the capabilities of listeners and add the following features:

- Receives a handle to the standard output and error print streams and therefore can log information to the console or the `-logfile` specified file.
- Logging level (`-quiet`, `-verbose`, `-debug`) aware.
- Emacs-mode aware. This still needs to be implemented.

## Built-in Listeners/Loggers

Class | Description | Type
--- | --- | ---
NAnt.Core.DefaultLogger | The logger used implicitly unless overridden with the `-logger` command-line switch. | IBuildLogger
NAnt.Core.MailLogger | Extends DefaultLogger such that output is still generated the same, and when the build is finished an e-mail can be sent. | IBuildLogger
NAnt.Core.XmlLogger | Generates output in XML format. | IBuildLogger

### DefaultLogger

Simply run NAnt normally, or:

> `NAnt.exe -logger:NAnt.Core.DefaultLogger`

### MailLogger

The MailLogger captures all output logged through DefaultLogger (standard NAnt output) and will send success and failure messages to unique e-mail lists, with control for turning off success or failure messages individually.

Properties controlling the operation of MailLogger are:

Property | Description | Required
--- | --- | ---
MailLogger.mailhost | The SMTP server to use. | No, default is "localhost"
MailLogger.from | The address of the e-mail sender. | Yes, if mail needs to be sent.
MailLogger.failure.notify | Send build failure e-mails ? | No, default is "true".
MailLogger.success.notify | Send build success e-mails ? | No, default is "true".
MailLogger.failure.to | The address to send build failure messages to. | Yes, if failure mail is to be sent.
MailLogger.success.to | The address to send build success messages to. | Yes, if success mail is to be sent.
MailLogger.failure.subject | The subject of build failure messages. | No, default is "Build Failure".
MailLogger.success.subject | The subject of build success messages. | No, default is "Build Success".
MailLogger.failure.attachments | The ID of a fileset representing a set of files to attach when the build fails. | No.
MailLogger.success.attachments | The ID of a fileset representing a set of files to attach when the build is successful. | No.
MailLogger.body.encoding | The encoding type of the body of the e-mail message. | No, default is system's ANSI code page.
MailLogger.smtp.username1 | The name of the user to login to the SMTP server. | No.
MailLogger.smtp.password1 | The password of the specified user. | No.
MailLogger.smtp.enablessl1 | Specifies whether to use SSL to encrypt the connection. | No, default is "false".
MailLogger.smtp.port1 | The SMTP server port to connect to. | No, default is "25".

1 Only available when NAnt is built targeting .NET Framework 1.1 (or equivalent) or higher.

Usage:

> `NAnt.exe -logger:NAnt.Core.MailLogger`

Example:

        <project name="MailLogger Test" default="build">
            <property name="MailLogger.mailhost" value="smtp.wherever.be" />
            <property name="MailLogger.from" value="me@telenet.be" />
            <property name="MailLogger.failure.notify" value="true" />
            <property name="MailLogger.success.notify" value="true" />
            <property name="MailLogger.failure.to" value="support@home.be" />
            <property name="MailLogger.success.to" value="support@home.be" />
            <property name="MailLogger.failure.subject" value="Nightly build failure !" />
            <property name="MailLogger.success.subject" value="Nightly build successful" />
            <property name="MailLogger.failure.attachments" value="MailLogger.failure.files" />
            <property name="MailLogger.success.attachments" value="MailLogger.success.files" />

            <!-- set of files to attach when build fails -->
            <fileset id="MailLogger.failure.files">
                <include name="dump.log" />
                <include name="trace.txt" />
            </fileset>

            <!-- set of files to attach when build is successful -->
            <fileset id="MailLogger.success.files">
                <include name="trace.txt" />
            </fileset>

            <target name="build">
                <echo message="Starting build" />
                ....
                <echo message="Finished build" />
            </target>
        </project>

### XmlLogger

Writes all build information out to an XML file named `log.xml`, or the value of the `XmlLogger.file` 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 `-logfile`.

Whether used as a listener or logger, the output is not generated until the build is complete.

Usage:

> `NAnt.exe -listener:NAnt.Core.XmlLogger`
> `NAnt.exe -logger:NAnt.Core.XmlLogger -logfile:buildlog.xml`

Example:

        <buildresults project="test">
            <message level="Info"><![CDATA[Buildfile: file:///D:/nant-test/xmlpeek/default.build]]></message>
            <message level="Info"><![CDATA[Target framework: Microsoft .NET Framework 1.1]]></message>
            <message level="Info"><![CDATA[Target(s) specified: build]]></message>
            <target name="build">
                <task name="xmlpeek">
                    <message level="Info"><![CDATA[Peeking at 'D:\nant-test\xmlpeek\input.xml' with XPath expression 'x:parameters/x:param'.]]></message>
                    <message level="Info"><![CDATA[Found '1' nodes with the XPath expression 'x:parameters/x:param'.]]></message>
                    <duration>15.625</duration>
                </task>
                <duration>15.625</duration>
            </target>
            <duration>31.25</duration>
        </buildresults>