<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
<FONT color="green">003</FONT>     * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
<FONT color="green">004</FONT>     * this work for additional information regarding copyright ownership.<a name="line.4"></a>
<FONT color="green">005</FONT>     * The ASF licenses this file to You under the Apache license, Version 2.0<a name="line.5"></a>
<FONT color="green">006</FONT>     * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
<FONT color="green">007</FONT>     * the License. You may obtain a copy of the License at<a name="line.7"></a>
<FONT color="green">008</FONT>     *<a name="line.8"></a>
<FONT color="green">009</FONT>     *      http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
<FONT color="green">010</FONT>     *<a name="line.10"></a>
<FONT color="green">011</FONT>     * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
<FONT color="green">012</FONT>     * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
<FONT color="green">013</FONT>     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
<FONT color="green">014</FONT>     * See the license for the specific language governing permissions and<a name="line.14"></a>
<FONT color="green">015</FONT>     * limitations under the license.<a name="line.15"></a>
<FONT color="green">016</FONT>     */<a name="line.16"></a>
<FONT color="green">017</FONT>    package org.apache.logging.log4j.core.appender;<a name="line.17"></a>
<FONT color="green">018</FONT>    <a name="line.18"></a>
<FONT color="green">019</FONT>    import org.apache.logging.log4j.core.Filter;<a name="line.19"></a>
<FONT color="green">020</FONT>    import org.apache.logging.log4j.core.Layout;<a name="line.20"></a>
<FONT color="green">021</FONT>    import org.apache.logging.log4j.core.config.plugins.Plugin;<a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginAttr;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginElement;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginFactory;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.logging.log4j.core.layout.PatternLayout;<a name="line.25"></a>
<FONT color="green">026</FONT>    <a name="line.26"></a>
<FONT color="green">027</FONT>    import java.io.OutputStream;<a name="line.27"></a>
<FONT color="green">028</FONT>    <a name="line.28"></a>
<FONT color="green">029</FONT>    /**<a name="line.29"></a>
<FONT color="green">030</FONT>     * ConsoleAppender appends log events to &lt;code&gt;System.out&lt;/code&gt; or<a name="line.30"></a>
<FONT color="green">031</FONT>     * &lt;code&gt;System.err&lt;/code&gt; using a layout specified by the user. The<a name="line.31"></a>
<FONT color="green">032</FONT>     * default target is &lt;code&gt;System.out&lt;/code&gt;.<a name="line.32"></a>
<FONT color="green">033</FONT>     * @doubt accessing System.out or .err as a byte stream instead of a writer<a name="line.33"></a>
<FONT color="green">034</FONT>     *    bypasses the JVM's knowledge of the proper encoding. (RG) Encoding<a name="line.34"></a>
<FONT color="green">035</FONT>     * is handled within the Layout. Typically, a Layout will generate a String<a name="line.35"></a>
<FONT color="green">036</FONT>     * and then call getBytes which may use a configured encoding or the system<a name="line.36"></a>
<FONT color="green">037</FONT>     * default. OTOH, a Writer cannot print byte streams.<a name="line.37"></a>
<FONT color="green">038</FONT>     */<a name="line.38"></a>
<FONT color="green">039</FONT>    @Plugin(name = "Console", type = "Core", elementType = "appender", printObject = true)<a name="line.39"></a>
<FONT color="green">040</FONT>    public final class ConsoleAppender extends OutputStreamAppender {<a name="line.40"></a>
<FONT color="green">041</FONT>    <a name="line.41"></a>
<FONT color="green">042</FONT>        private static ManagerFactory factory = new ConsoleManagerFactory();<a name="line.42"></a>
<FONT color="green">043</FONT>    <a name="line.43"></a>
<FONT color="green">044</FONT>        /**<a name="line.44"></a>
<FONT color="green">045</FONT>         * Enumeration of console destinations.<a name="line.45"></a>
<FONT color="green">046</FONT>         */<a name="line.46"></a>
<FONT color="green">047</FONT>        public enum Target {<a name="line.47"></a>
<FONT color="green">048</FONT>            /** Standard output. */<a name="line.48"></a>
<FONT color="green">049</FONT>            SYSTEM_OUT,<a name="line.49"></a>
<FONT color="green">050</FONT>            /** Standard error output. */<a name="line.50"></a>
<FONT color="green">051</FONT>            SYSTEM_ERR<a name="line.51"></a>
<FONT color="green">052</FONT>        }<a name="line.52"></a>
<FONT color="green">053</FONT>    <a name="line.53"></a>
<FONT color="green">054</FONT>        private ConsoleAppender(String name, Layout layout, Filter filter, OutputStreamManager manager,<a name="line.54"></a>
<FONT color="green">055</FONT>                               boolean handleExceptions) {<a name="line.55"></a>
<FONT color="green">056</FONT>            super(name, layout, filter, handleExceptions, true, manager);<a name="line.56"></a>
<FONT color="green">057</FONT>        }<a name="line.57"></a>
<FONT color="green">058</FONT>    <a name="line.58"></a>
<FONT color="green">059</FONT>        /**<a name="line.59"></a>
<FONT color="green">060</FONT>         * Create a Console Appender.<a name="line.60"></a>
<FONT color="green">061</FONT>         * @param layout The layout to use (required).<a name="line.61"></a>
<FONT color="green">062</FONT>         * @param filter The Filter or null.<a name="line.62"></a>
<FONT color="green">063</FONT>         * @param t The target ("SYSTEM_OUT" or "SYSTEM_ERR"). The default is "SYSTEM_OUT".<a name="line.63"></a>
<FONT color="green">064</FONT>         * @param name The name of the Appender (required).<a name="line.64"></a>
<FONT color="green">065</FONT>         * @param suppress "true" if exceptions should be hidden from the application, "false" otherwise.<a name="line.65"></a>
<FONT color="green">066</FONT>         * The default is "true".<a name="line.66"></a>
<FONT color="green">067</FONT>         * @return The ConsoleAppender.<a name="line.67"></a>
<FONT color="green">068</FONT>         */<a name="line.68"></a>
<FONT color="green">069</FONT>        @PluginFactory<a name="line.69"></a>
<FONT color="green">070</FONT>        public static ConsoleAppender createAppender(@PluginElement("layout") Layout layout,<a name="line.70"></a>
<FONT color="green">071</FONT>                                                     @PluginElement("filters") Filter filter,<a name="line.71"></a>
<FONT color="green">072</FONT>                                                     @PluginAttr("target") String t,<a name="line.72"></a>
<FONT color="green">073</FONT>                                                     @PluginAttr("name") String name,<a name="line.73"></a>
<FONT color="green">074</FONT>                                                     @PluginAttr("suppressExceptions") String suppress) {<a name="line.74"></a>
<FONT color="green">075</FONT>            if (name == null) {<a name="line.75"></a>
<FONT color="green">076</FONT>                LOGGER.error("No name provided for ConsoleAppender");<a name="line.76"></a>
<FONT color="green">077</FONT>                return null;<a name="line.77"></a>
<FONT color="green">078</FONT>            }<a name="line.78"></a>
<FONT color="green">079</FONT>            if (layout == null) {<a name="line.79"></a>
<FONT color="green">080</FONT>                layout = PatternLayout.createLayout(null, null, null, null);<a name="line.80"></a>
<FONT color="green">081</FONT>            }<a name="line.81"></a>
<FONT color="green">082</FONT>            boolean handleExceptions = suppress == null ? true : Boolean.valueOf(suppress);<a name="line.82"></a>
<FONT color="green">083</FONT>            Target target = t == null ? Target.SYSTEM_OUT : Target.valueOf(t);<a name="line.83"></a>
<FONT color="green">084</FONT>            return new ConsoleAppender(name, layout, filter, getManager(target), handleExceptions);<a name="line.84"></a>
<FONT color="green">085</FONT>        }<a name="line.85"></a>
<FONT color="green">086</FONT>    <a name="line.86"></a>
<FONT color="green">087</FONT>        private static OutputStreamManager getManager(Target target) {<a name="line.87"></a>
<FONT color="green">088</FONT>            String type = target.name();<a name="line.88"></a>
<FONT color="green">089</FONT>            OutputStream os = target == Target.SYSTEM_OUT ? System.out : System.err;<a name="line.89"></a>
<FONT color="green">090</FONT>            OutputStreamManager manager = OutputStreamManager.getManager(target.name(), factory,<a name="line.90"></a>
<FONT color="green">091</FONT>                new FactoryData(os, type));<a name="line.91"></a>
<FONT color="green">092</FONT>            return manager;<a name="line.92"></a>
<FONT color="green">093</FONT>        }<a name="line.93"></a>
<FONT color="green">094</FONT>    <a name="line.94"></a>
<FONT color="green">095</FONT>        /**<a name="line.95"></a>
<FONT color="green">096</FONT>         * Data to pass to factory method.<a name="line.96"></a>
<FONT color="green">097</FONT>         */<a name="line.97"></a>
<FONT color="green">098</FONT>        private static class FactoryData {<a name="line.98"></a>
<FONT color="green">099</FONT>            private OutputStream os;<a name="line.99"></a>
<FONT color="green">100</FONT>            private String type;<a name="line.100"></a>
<FONT color="green">101</FONT>    <a name="line.101"></a>
<FONT color="green">102</FONT>            /**<a name="line.102"></a>
<FONT color="green">103</FONT>             * Constructor.<a name="line.103"></a>
<FONT color="green">104</FONT>             * @param os The OutputStream.<a name="line.104"></a>
<FONT color="green">105</FONT>             * @param type The name of the target.<a name="line.105"></a>
<FONT color="green">106</FONT>             */<a name="line.106"></a>
<FONT color="green">107</FONT>            public FactoryData(OutputStream os, String type) {<a name="line.107"></a>
<FONT color="green">108</FONT>                this.os = os;<a name="line.108"></a>
<FONT color="green">109</FONT>                this.type = type;<a name="line.109"></a>
<FONT color="green">110</FONT>            }<a name="line.110"></a>
<FONT color="green">111</FONT>        }<a name="line.111"></a>
<FONT color="green">112</FONT>    <a name="line.112"></a>
<FONT color="green">113</FONT>        /**<a name="line.113"></a>
<FONT color="green">114</FONT>         * Factory to create the Appender.<a name="line.114"></a>
<FONT color="green">115</FONT>         */<a name="line.115"></a>
<FONT color="green">116</FONT>        private static class ConsoleManagerFactory implements ManagerFactory&lt;OutputStreamManager, FactoryData&gt; {<a name="line.116"></a>
<FONT color="green">117</FONT>    <a name="line.117"></a>
<FONT color="green">118</FONT>            /**<a name="line.118"></a>
<FONT color="green">119</FONT>             * Create an OutputStreamManager.<a name="line.119"></a>
<FONT color="green">120</FONT>             * @param name The name of the entity to manage.<a name="line.120"></a>
<FONT color="green">121</FONT>             * @param data The data required to create the entity.<a name="line.121"></a>
<FONT color="green">122</FONT>             * @return The OutputStreamManager<a name="line.122"></a>
<FONT color="green">123</FONT>             */<a name="line.123"></a>
<FONT color="green">124</FONT>            public OutputStreamManager createManager(String name, FactoryData data) {<a name="line.124"></a>
<FONT color="green">125</FONT>                return new OutputStreamManager(data.os, data.type);<a name="line.125"></a>
<FONT color="green">126</FONT>            }<a name="line.126"></a>
<FONT color="green">127</FONT>        }<a name="line.127"></a>
<FONT color="green">128</FONT>    <a name="line.128"></a>
<FONT color="green">129</FONT>    }<a name="line.129"></a>




























































</PRE>
</BODY>
</HTML>
