<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;<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.Level;<a name="line.19"></a>
<FONT color="green">020</FONT>    import org.apache.logging.log4j.Marker;<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.LoggerConfig;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.logging.log4j.core.filter.CompositeFilter;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.logging.log4j.message.Message;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.logging.log4j.message.SimpleMessage;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.logging.log4j.spi.AbstractLogger;<a name="line.26"></a>
<FONT color="green">027</FONT>    <a name="line.27"></a>
<FONT color="green">028</FONT>    import java.util.ArrayList;<a name="line.28"></a>
<FONT color="green">029</FONT>    import java.util.Iterator;<a name="line.29"></a>
<FONT color="green">030</FONT>    import java.util.List;<a name="line.30"></a>
<FONT color="green">031</FONT>    import java.util.Map;<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>     * @doubt All the isEnabled methods could be pushed into a filter interface.  Not sure of the utility of having<a name="line.34"></a>
<FONT color="green">035</FONT>     * isEnabled be able to examine the message pattern and parameters. (RG) Moving the isEnabled methods out of<a name="line.35"></a>
<FONT color="green">036</FONT>     * Logger noticeably impacts performance. The message pattern and parameters are required so that they can be<a name="line.36"></a>
<FONT color="green">037</FONT>     * used in global filters.<a name="line.37"></a>
<FONT color="green">038</FONT>     */<a name="line.38"></a>
<FONT color="green">039</FONT>    public class Logger extends AbstractLogger {<a name="line.39"></a>
<FONT color="green">040</FONT>    <a name="line.40"></a>
<FONT color="green">041</FONT>        /**<a name="line.41"></a>
<FONT color="green">042</FONT>         * config should be consistent across threads.<a name="line.42"></a>
<FONT color="green">043</FONT>         */<a name="line.43"></a>
<FONT color="green">044</FONT>        protected volatile PrivateConfig config;<a name="line.44"></a>
<FONT color="green">045</FONT>    <a name="line.45"></a>
<FONT color="green">046</FONT>        private final String name;<a name="line.46"></a>
<FONT color="green">047</FONT>    <a name="line.47"></a>
<FONT color="green">048</FONT>        private final LoggerContext context;<a name="line.48"></a>
<FONT color="green">049</FONT>    <a name="line.49"></a>
<FONT color="green">050</FONT>        /**<a name="line.50"></a>
<FONT color="green">051</FONT>         * The constructor.<a name="line.51"></a>
<FONT color="green">052</FONT>         * @param context The LoggerContext this Logger is associated with.<a name="line.52"></a>
<FONT color="green">053</FONT>         * @param name The name of the Logger.<a name="line.53"></a>
<FONT color="green">054</FONT>         */<a name="line.54"></a>
<FONT color="green">055</FONT>        protected Logger(LoggerContext context, String name) {<a name="line.55"></a>
<FONT color="green">056</FONT>            this.context = context;<a name="line.56"></a>
<FONT color="green">057</FONT>            this.name = name;<a name="line.57"></a>
<FONT color="green">058</FONT>            config = new PrivateConfig(context.getConfiguration(), this);<a name="line.58"></a>
<FONT color="green">059</FONT>        }<a name="line.59"></a>
<FONT color="green">060</FONT>    <a name="line.60"></a>
<FONT color="green">061</FONT>        /**<a name="line.61"></a>
<FONT color="green">062</FONT>         * Returns the name of the Logger.<a name="line.62"></a>
<FONT color="green">063</FONT>         * @return the name of the Logger.<a name="line.63"></a>
<FONT color="green">064</FONT>         */<a name="line.64"></a>
<FONT color="green">065</FONT>        public String getName() {<a name="line.65"></a>
<FONT color="green">066</FONT>            return name;<a name="line.66"></a>
<FONT color="green">067</FONT>        }<a name="line.67"></a>
<FONT color="green">068</FONT>    <a name="line.68"></a>
<FONT color="green">069</FONT>        /**<a name="line.69"></a>
<FONT color="green">070</FONT>         * Return the parent of this Logger. If it doesn't already exist return a temporary Logger.<a name="line.70"></a>
<FONT color="green">071</FONT>         * @return The parent Logger.<a name="line.71"></a>
<FONT color="green">072</FONT>         */<a name="line.72"></a>
<FONT color="green">073</FONT>        public Logger getParent() {<a name="line.73"></a>
<FONT color="green">074</FONT>            LoggerConfig lc = config.loggerConfig.getParent();<a name="line.74"></a>
<FONT color="green">075</FONT>            if (lc == null) {<a name="line.75"></a>
<FONT color="green">076</FONT>                return null;<a name="line.76"></a>
<FONT color="green">077</FONT>            }<a name="line.77"></a>
<FONT color="green">078</FONT>            if (context.hasLogger(lc.getName())) {<a name="line.78"></a>
<FONT color="green">079</FONT>                return context.getLogger(name);<a name="line.79"></a>
<FONT color="green">080</FONT>            }<a name="line.80"></a>
<FONT color="green">081</FONT>            return new Logger(context, name);<a name="line.81"></a>
<FONT color="green">082</FONT>        }<a name="line.82"></a>
<FONT color="green">083</FONT>    <a name="line.83"></a>
<FONT color="green">084</FONT>        /**<a name="line.84"></a>
<FONT color="green">085</FONT>         * Return the LoggerContext this Logger is associated with.<a name="line.85"></a>
<FONT color="green">086</FONT>         * @return the LoggerContext.<a name="line.86"></a>
<FONT color="green">087</FONT>         */<a name="line.87"></a>
<FONT color="green">088</FONT>        public LoggerContext getContext() {<a name="line.88"></a>
<FONT color="green">089</FONT>            return context;<a name="line.89"></a>
<FONT color="green">090</FONT>        }<a name="line.90"></a>
<FONT color="green">091</FONT>    <a name="line.91"></a>
<FONT color="green">092</FONT>        /**<a name="line.92"></a>
<FONT color="green">093</FONT>         * This method is not exposed through the public API and is provided primarily for unit testing.<a name="line.93"></a>
<FONT color="green">094</FONT>         * @param level The Level to use on this Logger.<a name="line.94"></a>
<FONT color="green">095</FONT>         */<a name="line.95"></a>
<FONT color="green">096</FONT>        public synchronized void setLevel(Level level) {<a name="line.96"></a>
<FONT color="green">097</FONT>            if (level != null) {<a name="line.97"></a>
<FONT color="green">098</FONT>                config = new PrivateConfig(config, level);<a name="line.98"></a>
<FONT color="green">099</FONT>            }<a name="line.99"></a>
<FONT color="green">100</FONT>        }<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>         * Return the Level associated with the Logger.<a name="line.103"></a>
<FONT color="green">104</FONT>         * @return the Level associate with the Logger.<a name="line.104"></a>
<FONT color="green">105</FONT>         */<a name="line.105"></a>
<FONT color="green">106</FONT>        public Level getLevel() {<a name="line.106"></a>
<FONT color="green">107</FONT>            return config.level;<a name="line.107"></a>
<FONT color="green">108</FONT>        }<a name="line.108"></a>
<FONT color="green">109</FONT>    <a name="line.109"></a>
<FONT color="green">110</FONT>        @Override<a name="line.110"></a>
<FONT color="green">111</FONT>        public void log(Marker marker, String fqcn, Level level, Message data, Throwable t) {<a name="line.111"></a>
<FONT color="green">112</FONT>            if (data == null) {<a name="line.112"></a>
<FONT color="green">113</FONT>                data = new SimpleMessage("");<a name="line.113"></a>
<FONT color="green">114</FONT>            }<a name="line.114"></a>
<FONT color="green">115</FONT>            config.loggerConfig.log(name, marker, fqcn, level, data, t);<a name="line.115"></a>
<FONT color="green">116</FONT>        }<a name="line.116"></a>
<FONT color="green">117</FONT>    <a name="line.117"></a>
<FONT color="green">118</FONT>        @Override<a name="line.118"></a>
<FONT color="green">119</FONT>        public boolean isEnabled(Level level, Marker marker, String msg) {<a name="line.119"></a>
<FONT color="green">120</FONT>            return config.filter(level, marker, msg);<a name="line.120"></a>
<FONT color="green">121</FONT>        }<a name="line.121"></a>
<FONT color="green">122</FONT>    <a name="line.122"></a>
<FONT color="green">123</FONT>        @Override<a name="line.123"></a>
<FONT color="green">124</FONT>        public boolean isEnabled(Level level, Marker marker, String msg, Throwable t) {<a name="line.124"></a>
<FONT color="green">125</FONT>            return config.filter(level, marker, msg, t);<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>        @Override<a name="line.128"></a>
<FONT color="green">129</FONT>        public boolean isEnabled(Level level, Marker marker, String msg, Object p1) {<a name="line.129"></a>
<FONT color="green">130</FONT>            return config.filter(level, marker, msg, p1);<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>
<FONT color="green">133</FONT>        @Override<a name="line.133"></a>
<FONT color="green">134</FONT>        public boolean isEnabled(Level level, Marker marker, String msg, Object p1, Object p2) {<a name="line.134"></a>
<FONT color="green">135</FONT>            return config.filter(level, marker, msg, p1, p2);<a name="line.135"></a>
<FONT color="green">136</FONT>        }<a name="line.136"></a>
<FONT color="green">137</FONT>    <a name="line.137"></a>
<FONT color="green">138</FONT>        @Override<a name="line.138"></a>
<FONT color="green">139</FONT>        public boolean isEnabled(Level level, Marker marker, String msg, Object p1, Object p2, Object p3) {<a name="line.139"></a>
<FONT color="green">140</FONT>            return config.filter(level, marker, msg, p1, p2, p3);<a name="line.140"></a>
<FONT color="green">141</FONT>        }<a name="line.141"></a>
<FONT color="green">142</FONT>    <a name="line.142"></a>
<FONT color="green">143</FONT>        @Override<a name="line.143"></a>
<FONT color="green">144</FONT>        public boolean isEnabled(Level level, Marker marker, String msg, Object p1, Object p2, Object p3,<a name="line.144"></a>
<FONT color="green">145</FONT>                                    Object... params) {<a name="line.145"></a>
<FONT color="green">146</FONT>            return config.filter(level, marker, msg, p1, p2, p3, params);<a name="line.146"></a>
<FONT color="green">147</FONT>        }<a name="line.147"></a>
<FONT color="green">148</FONT>    <a name="line.148"></a>
<FONT color="green">149</FONT>        @Override<a name="line.149"></a>
<FONT color="green">150</FONT>        public boolean isEnabled(Level level, Marker marker, Object msg, Throwable t) {<a name="line.150"></a>
<FONT color="green">151</FONT>            return config.filter(level, marker, msg, t);<a name="line.151"></a>
<FONT color="green">152</FONT>        }<a name="line.152"></a>
<FONT color="green">153</FONT>    <a name="line.153"></a>
<FONT color="green">154</FONT>        @Override<a name="line.154"></a>
<FONT color="green">155</FONT>        public boolean isEnabled(Level level, Marker marker, Message msg, Throwable t) {<a name="line.155"></a>
<FONT color="green">156</FONT>            return config.filter(level, marker, msg, t);<a name="line.156"></a>
<FONT color="green">157</FONT>        }<a name="line.157"></a>
<FONT color="green">158</FONT>    <a name="line.158"></a>
<FONT color="green">159</FONT>        /**<a name="line.159"></a>
<FONT color="green">160</FONT>         * This method is not exposed through the public API and is used primarily for unit testing.<a name="line.160"></a>
<FONT color="green">161</FONT>         * @param appender The Appender to add to the Logger.<a name="line.161"></a>
<FONT color="green">162</FONT>         */<a name="line.162"></a>
<FONT color="green">163</FONT>        public void addAppender(Appender appender) {<a name="line.163"></a>
<FONT color="green">164</FONT>            config.config.addLoggerAppender(this, appender);<a name="line.164"></a>
<FONT color="green">165</FONT>        }<a name="line.165"></a>
<FONT color="green">166</FONT>    <a name="line.166"></a>
<FONT color="green">167</FONT>        /**<a name="line.167"></a>
<FONT color="green">168</FONT>         * This method is not exposed through the public API and is used primarily for unit testing.<a name="line.168"></a>
<FONT color="green">169</FONT>         * @param appender The Appender to remove from the Logger.<a name="line.169"></a>
<FONT color="green">170</FONT>         */<a name="line.170"></a>
<FONT color="green">171</FONT>        public void removeAppender(Appender appender) {<a name="line.171"></a>
<FONT color="green">172</FONT>            config.loggerConfig.removeAppender(appender.getName());<a name="line.172"></a>
<FONT color="green">173</FONT>        }<a name="line.173"></a>
<FONT color="green">174</FONT>    <a name="line.174"></a>
<FONT color="green">175</FONT>        /**<a name="line.175"></a>
<FONT color="green">176</FONT>         * This method is not exposed through the public API and is used primarily for unit testing.<a name="line.176"></a>
<FONT color="green">177</FONT>         * @return A Map containing the Appender's name as the key and the Appender as the value.<a name="line.177"></a>
<FONT color="green">178</FONT>         */<a name="line.178"></a>
<FONT color="green">179</FONT>        public Map&lt;String, Appender&gt; getAppenders() {<a name="line.179"></a>
<FONT color="green">180</FONT>             return config.loggerConfig.getAppenders();<a name="line.180"></a>
<FONT color="green">181</FONT>        }<a name="line.181"></a>
<FONT color="green">182</FONT>    <a name="line.182"></a>
<FONT color="green">183</FONT>        /**<a name="line.183"></a>
<FONT color="green">184</FONT>         * This method is not exposed through the public API and is used primarily for unit testing.<a name="line.184"></a>
<FONT color="green">185</FONT>         * @return An Iterator over all the Filters associated with the Logger.<a name="line.185"></a>
<FONT color="green">186</FONT>         */<a name="line.186"></a>
<FONT color="green">187</FONT>        public Iterator&lt;Filter&gt; getFilters() {<a name="line.187"></a>
<FONT color="green">188</FONT>            Filter filter = config.loggerConfig.getFilter();<a name="line.188"></a>
<FONT color="green">189</FONT>            if (filter == null) {<a name="line.189"></a>
<FONT color="green">190</FONT>                return new ArrayList&lt;Filter&gt;().iterator();<a name="line.190"></a>
<FONT color="green">191</FONT>            } else if (filter instanceof CompositeFilter) {<a name="line.191"></a>
<FONT color="green">192</FONT>                return ((CompositeFilter) filter).iterator();<a name="line.192"></a>
<FONT color="green">193</FONT>            } else {<a name="line.193"></a>
<FONT color="green">194</FONT>                List&lt;Filter&gt; filters = new ArrayList&lt;Filter&gt;();<a name="line.194"></a>
<FONT color="green">195</FONT>                filters.add(filter);<a name="line.195"></a>
<FONT color="green">196</FONT>                return filters.iterator();<a name="line.196"></a>
<FONT color="green">197</FONT>            }<a name="line.197"></a>
<FONT color="green">198</FONT>        }<a name="line.198"></a>
<FONT color="green">199</FONT>    <a name="line.199"></a>
<FONT color="green">200</FONT>        /**<a name="line.200"></a>
<FONT color="green">201</FONT>         * This method is not exposed through the public API and is used primarily for unit testing.<a name="line.201"></a>
<FONT color="green">202</FONT>         * @return The number of Filters associated with the Logger.<a name="line.202"></a>
<FONT color="green">203</FONT>         */<a name="line.203"></a>
<FONT color="green">204</FONT>        public int filterCount() {<a name="line.204"></a>
<FONT color="green">205</FONT>            Filter filter = config.loggerConfig.getFilter();<a name="line.205"></a>
<FONT color="green">206</FONT>            if (filter == null) {<a name="line.206"></a>
<FONT color="green">207</FONT>                return 0;<a name="line.207"></a>
<FONT color="green">208</FONT>            } else if (filter instanceof CompositeFilter) {<a name="line.208"></a>
<FONT color="green">209</FONT>                return ((CompositeFilter) filter).size();<a name="line.209"></a>
<FONT color="green">210</FONT>            }<a name="line.210"></a>
<FONT color="green">211</FONT>            return 1;<a name="line.211"></a>
<FONT color="green">212</FONT>        }<a name="line.212"></a>
<FONT color="green">213</FONT>    <a name="line.213"></a>
<FONT color="green">214</FONT>        /**<a name="line.214"></a>
<FONT color="green">215</FONT>         * This method is not exposed through the public API and is used primarily for unit testing.<a name="line.215"></a>
<FONT color="green">216</FONT>         * @param filter The Filter to add.<a name="line.216"></a>
<FONT color="green">217</FONT>         */<a name="line.217"></a>
<FONT color="green">218</FONT>        public void addFilter(Filter filter) {<a name="line.218"></a>
<FONT color="green">219</FONT>            config.config.addLoggerFilter(this, filter);<a name="line.219"></a>
<FONT color="green">220</FONT>        }<a name="line.220"></a>
<FONT color="green">221</FONT>    <a name="line.221"></a>
<FONT color="green">222</FONT>        /**<a name="line.222"></a>
<FONT color="green">223</FONT>         * This method is not exposed through the public API and is present only to support the Log4j 1.2<a name="line.223"></a>
<FONT color="green">224</FONT>         * compatibility bridge.<a name="line.224"></a>
<FONT color="green">225</FONT>         * @return true if the associated LoggerConfig is additive, false otherwise.<a name="line.225"></a>
<FONT color="green">226</FONT>         */<a name="line.226"></a>
<FONT color="green">227</FONT>        public boolean isAdditive() {<a name="line.227"></a>
<FONT color="green">228</FONT>            return config.loggerConfig.isAdditive();<a name="line.228"></a>
<FONT color="green">229</FONT>        }<a name="line.229"></a>
<FONT color="green">230</FONT>    <a name="line.230"></a>
<FONT color="green">231</FONT>        /**<a name="line.231"></a>
<FONT color="green">232</FONT>         * This method is not exposed through the public API and is present only to support the Log4j 1.2<a name="line.232"></a>
<FONT color="green">233</FONT>         * compatibility bridge.<a name="line.233"></a>
<FONT color="green">234</FONT>         * @param additive Boolean value to indicate whether the Logger is additive or not.<a name="line.234"></a>
<FONT color="green">235</FONT>         */<a name="line.235"></a>
<FONT color="green">236</FONT>        public void setAdditive(boolean additive) {<a name="line.236"></a>
<FONT color="green">237</FONT>            config.config.setLoggerAdditive(this, additive);<a name="line.237"></a>
<FONT color="green">238</FONT>        }<a name="line.238"></a>
<FONT color="green">239</FONT>    <a name="line.239"></a>
<FONT color="green">240</FONT>        /**<a name="line.240"></a>
<FONT color="green">241</FONT>         * Associates the Logger with a new Configuration. This method is not exposed through the<a name="line.241"></a>
<FONT color="green">242</FONT>         * public API.<a name="line.242"></a>
<FONT color="green">243</FONT>         *<a name="line.243"></a>
<FONT color="green">244</FONT>         * There are two ways that could be used to guarantee all threads are aware of changes to<a name="line.244"></a>
<FONT color="green">245</FONT>         * config. 1. synchronize this method. Accessors don't need to be synchronized as Java will<a name="line.245"></a>
<FONT color="green">246</FONT>         * treat all variables within a synchronized block as volatile. 2. Declare the variable<a name="line.246"></a>
<FONT color="green">247</FONT>         * volatile. Option 2 is used here as the performance cost is very low and it does a better<a name="line.247"></a>
<FONT color="green">248</FONT>         * job at documenting how it is used.<a name="line.248"></a>
<FONT color="green">249</FONT>         *<a name="line.249"></a>
<FONT color="green">250</FONT>         * @param config The new Configuration.<a name="line.250"></a>
<FONT color="green">251</FONT>         */<a name="line.251"></a>
<FONT color="green">252</FONT>        void updateConfiguration(Configuration config) {<a name="line.252"></a>
<FONT color="green">253</FONT>            this.config = new PrivateConfig(config, this);<a name="line.253"></a>
<FONT color="green">254</FONT>        }<a name="line.254"></a>
<FONT color="green">255</FONT>    <a name="line.255"></a>
<FONT color="green">256</FONT>        /**<a name="line.256"></a>
<FONT color="green">257</FONT>         * The binding between a Logger and its configuration.<a name="line.257"></a>
<FONT color="green">258</FONT>         */<a name="line.258"></a>
<FONT color="green">259</FONT>        protected class PrivateConfig {<a name="line.259"></a>
<FONT color="green">260</FONT>            private final LoggerConfig loggerConfig;<a name="line.260"></a>
<FONT color="green">261</FONT>            private final Configuration config;<a name="line.261"></a>
<FONT color="green">262</FONT>            private final Level level;<a name="line.262"></a>
<FONT color="green">263</FONT>            private final int intLevel;<a name="line.263"></a>
<FONT color="green">264</FONT>            private final Logger logger;<a name="line.264"></a>
<FONT color="green">265</FONT>    <a name="line.265"></a>
<FONT color="green">266</FONT>            public PrivateConfig(Configuration config, Logger logger) {<a name="line.266"></a>
<FONT color="green">267</FONT>                this.config = config;<a name="line.267"></a>
<FONT color="green">268</FONT>                this.loggerConfig = config.getLoggerConfig(name);<a name="line.268"></a>
<FONT color="green">269</FONT>                this.level = this.loggerConfig.getLevel();<a name="line.269"></a>
<FONT color="green">270</FONT>                this.intLevel = this.level.intLevel();<a name="line.270"></a>
<FONT color="green">271</FONT>                this.logger = logger;<a name="line.271"></a>
<FONT color="green">272</FONT>            }<a name="line.272"></a>
<FONT color="green">273</FONT>    <a name="line.273"></a>
<FONT color="green">274</FONT>            public PrivateConfig(PrivateConfig pc, Level level) {<a name="line.274"></a>
<FONT color="green">275</FONT>                this.config = pc.config;<a name="line.275"></a>
<FONT color="green">276</FONT>                this.loggerConfig = pc.loggerConfig;<a name="line.276"></a>
<FONT color="green">277</FONT>                this.level = level;<a name="line.277"></a>
<FONT color="green">278</FONT>                this.intLevel = this.level.intLevel();<a name="line.278"></a>
<FONT color="green">279</FONT>                this.logger = pc.logger;<a name="line.279"></a>
<FONT color="green">280</FONT>            }<a name="line.280"></a>
<FONT color="green">281</FONT>    <a name="line.281"></a>
<FONT color="green">282</FONT>            public PrivateConfig(PrivateConfig pc, LoggerConfig lc) {<a name="line.282"></a>
<FONT color="green">283</FONT>                this.config = pc.config;<a name="line.283"></a>
<FONT color="green">284</FONT>                this.loggerConfig = lc;<a name="line.284"></a>
<FONT color="green">285</FONT>                this.level = lc.getLevel();<a name="line.285"></a>
<FONT color="green">286</FONT>                this.intLevel = this.level.intLevel();<a name="line.286"></a>
<FONT color="green">287</FONT>                this.logger = pc.logger;<a name="line.287"></a>
<FONT color="green">288</FONT>            }<a name="line.288"></a>
<FONT color="green">289</FONT>    <a name="line.289"></a>
<FONT color="green">290</FONT>            protected void logEvent(LogEvent event) {<a name="line.290"></a>
<FONT color="green">291</FONT>                loggerConfig.log(event);<a name="line.291"></a>
<FONT color="green">292</FONT>            }<a name="line.292"></a>
<FONT color="green">293</FONT>    <a name="line.293"></a>
<FONT color="green">294</FONT>            boolean filter(Level level, Marker marker, String msg) {<a name="line.294"></a>
<FONT color="green">295</FONT>                Filter filter = config.getFilter();<a name="line.295"></a>
<FONT color="green">296</FONT>                if (filter != null) {<a name="line.296"></a>
<FONT color="green">297</FONT>                    Filter.Result r = filter.filter(logger, level, marker, msg);<a name="line.297"></a>
<FONT color="green">298</FONT>                    if (r != Filter.Result.NEUTRAL) {<a name="line.298"></a>
<FONT color="green">299</FONT>                        return r == Filter.Result.ACCEPT;<a name="line.299"></a>
<FONT color="green">300</FONT>                    }<a name="line.300"></a>
<FONT color="green">301</FONT>                }<a name="line.301"></a>
<FONT color="green">302</FONT>    <a name="line.302"></a>
<FONT color="green">303</FONT>                return intLevel &gt;= level.intLevel();<a name="line.303"></a>
<FONT color="green">304</FONT>            }<a name="line.304"></a>
<FONT color="green">305</FONT>    <a name="line.305"></a>
<FONT color="green">306</FONT>            boolean filter(Level level, Marker marker, String msg, Throwable t) {<a name="line.306"></a>
<FONT color="green">307</FONT>                Filter filter = config.getFilter();<a name="line.307"></a>
<FONT color="green">308</FONT>                if (filter != null) {<a name="line.308"></a>
<FONT color="green">309</FONT>                    Filter.Result r = filter.filter(logger, level, marker, msg, t);<a name="line.309"></a>
<FONT color="green">310</FONT>                    if (r != Filter.Result.NEUTRAL) {<a name="line.310"></a>
<FONT color="green">311</FONT>                        return r == Filter.Result.ACCEPT;<a name="line.311"></a>
<FONT color="green">312</FONT>                    }<a name="line.312"></a>
<FONT color="green">313</FONT>                }<a name="line.313"></a>
<FONT color="green">314</FONT>    <a name="line.314"></a>
<FONT color="green">315</FONT>                return intLevel &gt;= level.intLevel();<a name="line.315"></a>
<FONT color="green">316</FONT>            }<a name="line.316"></a>
<FONT color="green">317</FONT>    <a name="line.317"></a>
<FONT color="green">318</FONT>            boolean filter(Level level, Marker marker, String msg, Object p1) {<a name="line.318"></a>
<FONT color="green">319</FONT>                Filter filter = config.getFilter();<a name="line.319"></a>
<FONT color="green">320</FONT>                if (filter != null) {<a name="line.320"></a>
<FONT color="green">321</FONT>                    Filter.Result r = filter.filter(logger, level, marker, msg, p1);<a name="line.321"></a>
<FONT color="green">322</FONT>                    if (r != Filter.Result.NEUTRAL) {<a name="line.322"></a>
<FONT color="green">323</FONT>                        return r == Filter.Result.ACCEPT;<a name="line.323"></a>
<FONT color="green">324</FONT>                    }<a name="line.324"></a>
<FONT color="green">325</FONT>                }<a name="line.325"></a>
<FONT color="green">326</FONT>    <a name="line.326"></a>
<FONT color="green">327</FONT>                return intLevel &gt;= level.intLevel();<a name="line.327"></a>
<FONT color="green">328</FONT>            }<a name="line.328"></a>
<FONT color="green">329</FONT>    <a name="line.329"></a>
<FONT color="green">330</FONT>            boolean filter(Level level, Marker marker, String msg, Object p1, Object p2) {<a name="line.330"></a>
<FONT color="green">331</FONT>                Filter filter = config.getFilter();<a name="line.331"></a>
<FONT color="green">332</FONT>                if (filter != null) {<a name="line.332"></a>
<FONT color="green">333</FONT>                    Filter.Result r = filter.filter(logger, level, marker, msg, p1, p2);<a name="line.333"></a>
<FONT color="green">334</FONT>                    if (r != Filter.Result.NEUTRAL) {<a name="line.334"></a>
<FONT color="green">335</FONT>                        return r == Filter.Result.ACCEPT;<a name="line.335"></a>
<FONT color="green">336</FONT>                    }<a name="line.336"></a>
<FONT color="green">337</FONT>                }<a name="line.337"></a>
<FONT color="green">338</FONT>    <a name="line.338"></a>
<FONT color="green">339</FONT>                return intLevel &gt;= level.intLevel();<a name="line.339"></a>
<FONT color="green">340</FONT>            }<a name="line.340"></a>
<FONT color="green">341</FONT>    <a name="line.341"></a>
<FONT color="green">342</FONT>            boolean filter(Level level, Marker marker, String msg, Object p1, Object p2, Object p3) {<a name="line.342"></a>
<FONT color="green">343</FONT>                Filter filter = config.getFilter();<a name="line.343"></a>
<FONT color="green">344</FONT>                if (filter != null) {<a name="line.344"></a>
<FONT color="green">345</FONT>                    Filter.Result r = filter.filter(logger, level, marker, msg, p1, p2, p3);<a name="line.345"></a>
<FONT color="green">346</FONT>                    if (r != Filter.Result.NEUTRAL) {<a name="line.346"></a>
<FONT color="green">347</FONT>                        return r == Filter.Result.ACCEPT;<a name="line.347"></a>
<FONT color="green">348</FONT>                    }<a name="line.348"></a>
<FONT color="green">349</FONT>                }<a name="line.349"></a>
<FONT color="green">350</FONT>    <a name="line.350"></a>
<FONT color="green">351</FONT>                return intLevel &gt;= level.intLevel();<a name="line.351"></a>
<FONT color="green">352</FONT>            }<a name="line.352"></a>
<FONT color="green">353</FONT>    <a name="line.353"></a>
<FONT color="green">354</FONT>            boolean filter(Level level, Marker marker, String msg, Object p1, Object p2, Object p3,<a name="line.354"></a>
<FONT color="green">355</FONT>                           Object... params) {<a name="line.355"></a>
<FONT color="green">356</FONT>                Filter filter = config.getFilter();<a name="line.356"></a>
<FONT color="green">357</FONT>                if (filter != null) {<a name="line.357"></a>
<FONT color="green">358</FONT>                    Filter.Result r = filter.filter(logger, level, marker, msg, p1, p2, p3, params);<a name="line.358"></a>
<FONT color="green">359</FONT>                    if (r != Filter.Result.NEUTRAL) {<a name="line.359"></a>
<FONT color="green">360</FONT>                        return r == Filter.Result.ACCEPT;<a name="line.360"></a>
<FONT color="green">361</FONT>                    }<a name="line.361"></a>
<FONT color="green">362</FONT>                }<a name="line.362"></a>
<FONT color="green">363</FONT>    <a name="line.363"></a>
<FONT color="green">364</FONT>                return intLevel &gt;= level.intLevel();<a name="line.364"></a>
<FONT color="green">365</FONT>            }<a name="line.365"></a>
<FONT color="green">366</FONT>    <a name="line.366"></a>
<FONT color="green">367</FONT>            boolean filter(Level level, Marker marker, Object msg, Throwable t) {<a name="line.367"></a>
<FONT color="green">368</FONT>                Filter filter = config.getFilter();<a name="line.368"></a>
<FONT color="green">369</FONT>                if (filter != null) {<a name="line.369"></a>
<FONT color="green">370</FONT>                    Filter.Result r = filter.filter(logger, level, marker, msg, t);<a name="line.370"></a>
<FONT color="green">371</FONT>                    if (r != Filter.Result.NEUTRAL) {<a name="line.371"></a>
<FONT color="green">372</FONT>                        return r == Filter.Result.ACCEPT;<a name="line.372"></a>
<FONT color="green">373</FONT>                    }<a name="line.373"></a>
<FONT color="green">374</FONT>                }<a name="line.374"></a>
<FONT color="green">375</FONT>    <a name="line.375"></a>
<FONT color="green">376</FONT>                return intLevel &gt;= level.intLevel();<a name="line.376"></a>
<FONT color="green">377</FONT>            }<a name="line.377"></a>
<FONT color="green">378</FONT>    <a name="line.378"></a>
<FONT color="green">379</FONT>            boolean filter(Level level, Marker marker, Message msg, Throwable t) {<a name="line.379"></a>
<FONT color="green">380</FONT>                Filter filter = config.getFilter();<a name="line.380"></a>
<FONT color="green">381</FONT>                if (filter != null) {<a name="line.381"></a>
<FONT color="green">382</FONT>                    Filter.Result r = filter.filter(logger, level, marker, msg, t);<a name="line.382"></a>
<FONT color="green">383</FONT>                    if (r != Filter.Result.NEUTRAL) {<a name="line.383"></a>
<FONT color="green">384</FONT>                        return r == Filter.Result.ACCEPT;<a name="line.384"></a>
<FONT color="green">385</FONT>                    }<a name="line.385"></a>
<FONT color="green">386</FONT>                }<a name="line.386"></a>
<FONT color="green">387</FONT>    <a name="line.387"></a>
<FONT color="green">388</FONT>                return intLevel &gt;= level.intLevel();<a name="line.388"></a>
<FONT color="green">389</FONT>            }<a name="line.389"></a>
<FONT color="green">390</FONT>        }<a name="line.390"></a>
<FONT color="green">391</FONT>    }<a name="line.391"></a>




























































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