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

     https://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.
////

= outputters

*Tag:* outputters

[ivysettings.outputters]#Defines a list of report outputters usable in Ivy.#

A report outputter is used at the end of the resolve process to generate a report of how the resolve has been performed.

Two report outputters are registered by default:


    * a log report outputter (link:https://gitbox.apache.org/repos/asf?p=ant-ivy.git;a=blob;f=src/java/org/apache/ivy/plugins/report/LogReportOutputter.java[LogReportOutputter]) +
    which produces the output on the console at the end of the resolve, which looks like this:

[source,shell]
----

        ---------------------------------------------------------------------
        |                  |            modules            ||   artifacts   |
        |       conf       | number| search|dwnlded|evicted|| number|dwnlded|
        ---------------------------------------------------------------------
        |      default     |   1   |   1   |   0   |   0   ||   1   |   1   |
        ---------------------------------------------------------------------

----


    * an xml report outputter (link:https://gitbox.apache.org/repos/asf?p=ant-ivy.git;a=blob;f=src/java/org/apache/ivy/plugins/report/XmlReportOutputter.java[XmlReportOutputter]) +
    which produces an XML report in the cache, which is mandatory for correct Ivy behaviour, since it's that report which is used when you do a post resolve step in a separate build from the resolve itself. It's also this XML report which is processed to generate all the different reports available in the link:../use/report{outfilesuffix}[report] task.


The child tag used for the parser must be equal to a name of a report outputter type (added with the `typedef` tag).

To see how to define your own report outputter see link:../extend{outfilesuffix}[Extending Ivy documentation]


== Child elements


[options="header"]
|=======
|Element|Description|Cardinality
|any report outputter|adds a report outputter to the list of available ones|0..n
|=======
