<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.Configuration;<a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.logging.log4j.core.config.plugins.Plugin;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginAttr;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginElement;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.logging.log4j.core.config.plugins.PluginFactory;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.logging.log4j.core.layout.RFC5424Layout;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.apache.logging.log4j.core.layout.SyslogLayout;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.apache.logging.log4j.core.net.AbstractSocketManager;<a name="line.29"></a>
<FONT color="green">030</FONT>    <a name="line.30"></a>
<FONT color="green">031</FONT>    import java.nio.charset.Charset;<a name="line.31"></a>
<FONT color="green">032</FONT>    <a name="line.32"></a>
<FONT color="green">033</FONT>    /**<a name="line.33"></a>
<FONT color="green">034</FONT>     * The Syslog Appender.<a name="line.34"></a>
<FONT color="green">035</FONT>     */<a name="line.35"></a>
<FONT color="green">036</FONT>    @Plugin(name = "Syslog", type = "Core", elementType = "appender", printObject = true)<a name="line.36"></a>
<FONT color="green">037</FONT>    public class SyslogAppender extends SocketAppender {<a name="line.37"></a>
<FONT color="green">038</FONT>    <a name="line.38"></a>
<FONT color="green">039</FONT>        private static final String BSD = "bsd";<a name="line.39"></a>
<FONT color="green">040</FONT>    <a name="line.40"></a>
<FONT color="green">041</FONT>        private static final String RFC5424 = "RFC5424";<a name="line.41"></a>
<FONT color="green">042</FONT>    <a name="line.42"></a>
<FONT color="green">043</FONT>        protected SyslogAppender(String name, Layout layout, Filter filter,<a name="line.43"></a>
<FONT color="green">044</FONT>                              boolean handleException, boolean immediateFlush, AbstractSocketManager manager) {<a name="line.44"></a>
<FONT color="green">045</FONT>            super(name, layout, filter, manager, handleException, immediateFlush);<a name="line.45"></a>
<FONT color="green">046</FONT>    <a name="line.46"></a>
<FONT color="green">047</FONT>        }<a name="line.47"></a>
<FONT color="green">048</FONT>    <a name="line.48"></a>
<FONT color="green">049</FONT>        /**<a name="line.49"></a>
<FONT color="green">050</FONT>         * Create a SyslogAppender.<a name="line.50"></a>
<FONT color="green">051</FONT>         * @param host The name of the host to connect to.<a name="line.51"></a>
<FONT color="green">052</FONT>         * @param portNum The port to connect to on the target host.<a name="line.52"></a>
<FONT color="green">053</FONT>         * @param protocol The Protocol to use.<a name="line.53"></a>
<FONT color="green">054</FONT>         * @param delay The interval in which failed writes should be retried.<a name="line.54"></a>
<FONT color="green">055</FONT>         * @param name The name of the Appender.<a name="line.55"></a>
<FONT color="green">056</FONT>         * @param immediateFlush "true" if data should be flushed on each write.<a name="line.56"></a>
<FONT color="green">057</FONT>         * @param suppress "true" if exceptions should be hidden from the application, "false" otherwise.<a name="line.57"></a>
<FONT color="green">058</FONT>         * The default is "true".<a name="line.58"></a>
<FONT color="green">059</FONT>         * @param facility The Facility is used to try to classify the message.<a name="line.59"></a>
<FONT color="green">060</FONT>         * @param id The default structured data id to use when formatting according to RFC 5424.<a name="line.60"></a>
<FONT color="green">061</FONT>         * @param ein The IANA enterprise number.<a name="line.61"></a>
<FONT color="green">062</FONT>         * @param includeMDC Indicates whether data from the ThreadContextMap will be included in the RFC 5424 Syslog<a name="line.62"></a>
<FONT color="green">063</FONT>         * record. Defaults to "true:.<a name="line.63"></a>
<FONT color="green">064</FONT>         * @param mdcId The id to use for the MDC Structured Data Element.<a name="line.64"></a>
<FONT color="green">065</FONT>         * @param includeNL If true, a newline will be appended to the end of the syslog record. The default is false.<a name="line.65"></a>
<FONT color="green">066</FONT>         * @param appName The value to use as the APP-NAME in the RFC 5424 syslog record.<a name="line.66"></a>
<FONT color="green">067</FONT>         * @param msgId The default value to be used in the MSGID field of RFC 5424 syslog records.<a name="line.67"></a>
<FONT color="green">068</FONT>         * @param excludes A comma separated list of mdc keys that should be excluded from the LogEvent.<a name="line.68"></a>
<FONT color="green">069</FONT>         * @param includes A comma separated list of mdc keys that should be included in the FlumeEvent.<a name="line.69"></a>
<FONT color="green">070</FONT>         * @param required A comma separated list of mdc keys that must be present in the MDC.<a name="line.70"></a>
<FONT color="green">071</FONT>         * @param format If set to "RFC5424" the data will be formatted in accordance with RFC 5424. Otherwise,<a name="line.71"></a>
<FONT color="green">072</FONT>         * it will be formatted as a BSD Syslog record.<a name="line.72"></a>
<FONT color="green">073</FONT>         * @param filter A Filter to determine if the event should be handled by this Appender.<a name="line.73"></a>
<FONT color="green">074</FONT>         * @param config The Configuration.<a name="line.74"></a>
<FONT color="green">075</FONT>         * @param charset The character set to use when converting the syslog String to a byte array.<a name="line.75"></a>
<FONT color="green">076</FONT>         * @return A SyslogAppender.<a name="line.76"></a>
<FONT color="green">077</FONT>         */<a name="line.77"></a>
<FONT color="green">078</FONT>        @PluginFactory<a name="line.78"></a>
<FONT color="green">079</FONT>        public static SyslogAppender createAppender(@PluginAttr("host") String host,<a name="line.79"></a>
<FONT color="green">080</FONT>                                                    @PluginAttr("port") String portNum,<a name="line.80"></a>
<FONT color="green">081</FONT>                                                    @PluginAttr("protocol") String protocol,<a name="line.81"></a>
<FONT color="green">082</FONT>                                                    @PluginAttr("reconnectionDelay") String delay,<a name="line.82"></a>
<FONT color="green">083</FONT>                                                    @PluginAttr("name") String name,<a name="line.83"></a>
<FONT color="green">084</FONT>                                                    @PluginAttr("immediateFlush") String immediateFlush,<a name="line.84"></a>
<FONT color="green">085</FONT>                                                    @PluginAttr("suppressExceptions") String suppress,<a name="line.85"></a>
<FONT color="green">086</FONT>                                                    @PluginAttr("facility") String facility,<a name="line.86"></a>
<FONT color="green">087</FONT>                                                    @PluginAttr("id") String id,<a name="line.87"></a>
<FONT color="green">088</FONT>                                                    @PluginAttr("enterpriseNumber") String ein,<a name="line.88"></a>
<FONT color="green">089</FONT>                                                    @PluginAttr("includeMDC") String includeMDC,<a name="line.89"></a>
<FONT color="green">090</FONT>                                                    @PluginAttr("mdcId") String mdcId,<a name="line.90"></a>
<FONT color="green">091</FONT>                                                    @PluginAttr("newLine") String includeNL,<a name="line.91"></a>
<FONT color="green">092</FONT>                                                    @PluginAttr("appName") String appName,<a name="line.92"></a>
<FONT color="green">093</FONT>                                                    @PluginAttr("messageId") String msgId,<a name="line.93"></a>
<FONT color="green">094</FONT>                                                    @PluginAttr("mdcExcludes") String excludes,<a name="line.94"></a>
<FONT color="green">095</FONT>                                                    @PluginAttr("mdcIncludes") String includes,<a name="line.95"></a>
<FONT color="green">096</FONT>                                                    @PluginAttr("mdcRequired") String required,<a name="line.96"></a>
<FONT color="green">097</FONT>                                                    @PluginAttr("format") String format,<a name="line.97"></a>
<FONT color="green">098</FONT>                                                    @PluginElement("filters") Filter filter,<a name="line.98"></a>
<FONT color="green">099</FONT>                                                    @PluginConfiguration Configuration config,<a name="line.99"></a>
<FONT color="green">100</FONT>                                                    @PluginAttr("charset") String charset) {<a name="line.100"></a>
<FONT color="green">101</FONT>    <a name="line.101"></a>
<FONT color="green">102</FONT>            boolean isFlush = immediateFlush == null ? true : Boolean.valueOf(immediateFlush);<a name="line.102"></a>
<FONT color="green">103</FONT>            boolean handleExceptions = suppress == null ? true : Boolean.valueOf(suppress);<a name="line.103"></a>
<FONT color="green">104</FONT>            int reconnectDelay = delay == null ? 0 : Integer.parseInt(delay);<a name="line.104"></a>
<FONT color="green">105</FONT>            int port = portNum == null ? 0 : Integer.parseInt(portNum);<a name="line.105"></a>
<FONT color="green">106</FONT>            Charset c = Charset.isSupported("UTF-8") ? Charset.forName("UTF-8") : Charset.defaultCharset();<a name="line.106"></a>
<FONT color="green">107</FONT>            if (charset != null) {<a name="line.107"></a>
<FONT color="green">108</FONT>                if (Charset.isSupported(charset)) {<a name="line.108"></a>
<FONT color="green">109</FONT>                    c = Charset.forName(charset);<a name="line.109"></a>
<FONT color="green">110</FONT>                } else {<a name="line.110"></a>
<FONT color="green">111</FONT>                    LOGGER.error("Charset " + charset + " is not supported for layout, using " + c.displayName());<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>            Layout layout = (format.equalsIgnoreCase(RFC5424)) ?<a name="line.114"></a>
<FONT color="green">115</FONT>                RFC5424Layout.createLayout(facility, id, ein, includeMDC, mdcId, includeNL, appName,  msgId,<a name="line.115"></a>
<FONT color="green">116</FONT>                    excludes, includes, required, charset, config) :<a name="line.116"></a>
<FONT color="green">117</FONT>                SyslogLayout.createLayout(facility, includeNL, charset);<a name="line.117"></a>
<FONT color="green">118</FONT>    <a name="line.118"></a>
<FONT color="green">119</FONT>            if (name == null) {<a name="line.119"></a>
<FONT color="green">120</FONT>                LOGGER.error("No name provided for SyslogAppender");<a name="line.120"></a>
<FONT color="green">121</FONT>                return null;<a name="line.121"></a>
<FONT color="green">122</FONT>            }<a name="line.122"></a>
<FONT color="green">123</FONT>            AbstractSocketManager manager = createSocketManager(protocol, host, port, reconnectDelay);<a name="line.123"></a>
<FONT color="green">124</FONT>            if (manager == null) {<a name="line.124"></a>
<FONT color="green">125</FONT>                return null;<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>            return new SyslogAppender(name, layout, filter, handleExceptions, isFlush, manager);<a name="line.128"></a>
<FONT color="green">129</FONT>        }<a name="line.129"></a>
<FONT color="green">130</FONT>    <a name="line.130"></a>
<FONT color="green">131</FONT>    <a name="line.131"></a>
<FONT color="green">132</FONT>    }<a name="line.132"></a>




























































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