View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.logging.log4j.io;
19  
20  import java.io.ByteArrayOutputStream;
21  import java.io.IOException;
22  import java.io.OutputStream;
23  import java.io.PrintStream;
24  import java.io.UnsupportedEncodingException;
25  import java.nio.charset.Charset;
26  import java.util.Locale;
27  
28  import org.apache.logging.log4j.Level;
29  import org.apache.logging.log4j.Marker;
30  import org.apache.logging.log4j.io.internal.InternalPrintStream;
31  import org.apache.logging.log4j.spi.ExtendedLogger;
32  
33  /**
34   * Logs each line written to a pre-defined level. Can also be configured with a Marker. This class provides an interface
35   * that follows the {@link java.io.PrintStream} methods in spirit, but doesn't require output to any external stream.
36   * This class should <em>not</em> be used as a stream for an underlying logger unless it's being used as a bridge.
37   * Otherwise, infinite loops may occur!
38   *
39   * @since 2.1
40   */
41  public class LoggerPrintStream extends PrintStream {
42      private static final String FQCN = LoggerPrintStream.class.getName();
43      private final InternalPrintStream psLogger;
44  
45      protected LoggerPrintStream(final ExtendedLogger logger, final boolean autoFlush, final Charset charset,
46                                  final String fqcn, final Level level, final Marker marker)
47          throws UnsupportedEncodingException {
48          super(new PrintStream(new ByteArrayOutputStream()));
49          psLogger = new InternalPrintStream(logger, autoFlush, charset, fqcn == null ? FQCN : fqcn, level, marker);
50      }
51  
52      protected LoggerPrintStream(final OutputStream out, final boolean autoFlush, final Charset charset,
53                                  final ExtendedLogger logger, final String fqcn, final Level level, final Marker marker)
54          throws UnsupportedEncodingException {
55          super(new PrintStream(out));
56          psLogger = new InternalPrintStream(out, autoFlush, charset, logger, fqcn == null ? FQCN : fqcn, level, marker);
57      }
58  
59      private static Charset ensureNonNull(final Charset charset) {
60          return charset == null ? Charset.defaultCharset() : charset;
61      }
62  
63      @Override
64      public LoggerPrintStream append(final char c) {
65          psLogger.append(c);
66          return this;
67      }
68  
69      @Override
70      public LoggerPrintStream append(final CharSequence csq) {
71          psLogger.append(csq);
72          return this;
73      }
74  
75      @Override
76      public LoggerPrintStream append(final CharSequence csq, final int start, final int end) {
77          psLogger.append(csq, start, end);
78          return this;
79      }
80  
81      @Override
82      public boolean checkError() {
83          return psLogger.checkError();
84      }
85  
86      @Override
87      public void close() {
88          psLogger.close();
89      }
90  
91      @Override
92      public void flush() {
93          psLogger.flush();
94      }
95  
96      @Override
97      public LoggerPrintStream format(final Locale l, final String format, final Object... args) {
98          psLogger.format(l, format, args);
99          return this;
100     }
101 
102     @Override
103     public LoggerPrintStream format(final String format, final Object... args) {
104         psLogger.format(format, args);
105         return this;
106     }
107 
108     @Override
109     public void print(final boolean b) {
110         psLogger.print(b);
111     }
112 
113     @Override
114     public void print(final char c) {
115         psLogger.print(c);
116     }
117 
118     @Override
119     public void print(final char[] s) {
120         psLogger.print(s);
121     }
122 
123     @Override
124     public void print(final double d) {
125         psLogger.print(d);
126     }
127 
128     @Override
129     public void print(final float f) {
130         psLogger.print(f);
131     }
132 
133     @Override
134     public void print(final int i) {
135         psLogger.print(i);
136     }
137 
138     @Override
139     public void print(final long l) {
140         psLogger.print(l);
141     }
142 
143     @Override
144     public void print(final Object obj) {
145         psLogger.print(obj);
146     }
147 
148     @Override
149     public void print(final String s) {
150         psLogger.print(s);
151     }
152 
153     @Override
154     public LoggerPrintStream printf(final Locale l, final String format, final Object... args) {
155         psLogger.printf(l, format, args);
156         return this;
157     }
158 
159     @Override
160     public LoggerPrintStream printf(final String format, final Object... args) {
161         psLogger.printf(format, args);
162         return this;
163     }
164 
165     @Override
166     public void println() {
167         psLogger.println();
168     }
169 
170     @Override
171     public void println(final boolean x) {
172         psLogger.println(x);
173     }
174 
175     @Override
176     public void println(final char x) {
177         psLogger.println(x);
178     }
179 
180     @Override
181     public void println(final char[] x) {
182         psLogger.println(x);
183     }
184 
185     @Override
186     public void println(final double x) {
187         psLogger.println(x);
188     }
189 
190     @Override
191     public void println(final float x) {
192         psLogger.println(x);
193     }
194 
195     @Override
196     public void println(final int x) {
197         psLogger.println(x);
198     }
199 
200     @Override
201     public void println(final long x) {
202         psLogger.println(x);
203     }
204 
205     @Override
206     public void println(final Object x) {
207         psLogger.println(x);
208     }
209 
210     @Override
211     public void println(final String x) {
212         psLogger.println(x);
213     }
214 
215     @Override
216     public String toString() {
217         return LoggerPrintStream.class.getSimpleName() + psLogger.toString();
218     }
219 
220     @Override
221     public void write(final byte[] b) throws IOException {
222         psLogger.write(b);
223     }
224 
225     @Override
226     public void write(final byte[] b, final int off, final int len) {
227         psLogger.write(b, off, len);
228     }
229 
230     @Override
231     public void write(final int b) {
232         psLogger.write(b);
233     }
234 }