001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package org.apache.logging.log4j.io;
019
020import java.io.IOException;
021import java.io.PrintWriter;
022import java.io.StringWriter;
023import java.io.Writer;
024import java.util.Locale;
025
026import org.apache.logging.log4j.Level;
027import org.apache.logging.log4j.Marker;
028import org.apache.logging.log4j.io.internal.InternalPrintWriter;
029import org.apache.logging.log4j.spi.ExtendedLogger;
030
031/**
032 * Logs each line written to a pre-defined level. Can also be configured with a Marker. This class provides an interface
033 * that follows the {@link java.io.PrintWriter} methods in spirit, but doesn't require output to any external writer.
034 * <p>
035 * Integration with JDBC logging can be as simple as:
036 * </p>
037 * <pre>
038 *     PrintWriter pw = IoBuilder.forLogger().setLevel(Level.DEBUG).buildPrintWriter();
039 *     DriverManager.setLogWriter(pw);
040 *     DataSource ds = ...
041 *     ds.setLogWriter(pw);
042 * </pre>
043 *
044 * @since 2.1
045 */
046// TODO
047// All method implementations that call only writer.are apparently required for the unit tests to pass.
048// Not sure if this a bug in the tests or a feature.
049public class LoggerPrintWriter extends PrintWriter {
050    private static final String FQCN = LoggerPrintWriter.class.getName();
051    private final InternalPrintWriter writer;
052
053    protected LoggerPrintWriter(final ExtendedLogger logger, final boolean autoFlush, final String fqcn,
054                                final Level level, final Marker marker) {
055        super(new StringWriter());
056        writer = new InternalPrintWriter(logger, autoFlush, fqcn == null ? FQCN : fqcn, level, marker);
057    }
058
059    protected LoggerPrintWriter(final Writer writer, final boolean autoFlush, final ExtendedLogger logger,
060                                final String fqcn, final Level level, final Marker marker) {
061        super(writer);
062        this.writer = new InternalPrintWriter(writer, autoFlush, logger, fqcn == null ? FQCN : fqcn, level, marker);
063    }
064
065    @Override
066    public LoggerPrintWriter append(final char c) {
067        writer.append(c);
068        return this;
069    }
070
071    @Override
072    public LoggerPrintWriter append(final CharSequence csq) {
073        writer.append(csq);
074        return this;
075    }
076
077    @Override
078    public LoggerPrintWriter append(final CharSequence csq, final int start, final int end) {
079        writer.append(csq, start, end);
080        return this;
081    }
082
083    @Override
084    public boolean checkError() {
085        return writer.checkError();
086    }
087
088    @Override
089    public void close() {
090        writer.close();
091    }
092
093    @Override
094    public void flush() {
095        writer.flush();
096    }
097
098    @Override
099    public LoggerPrintWriter format(final Locale l, final String format, final Object... args) {
100        writer.format(l, format, args);
101        return this;
102    }
103
104    @Override
105    public LoggerPrintWriter format(final String format, final Object... args) {
106        writer.format(format, args);
107        return this;
108    }
109
110    @Override
111    public void print(final boolean b) {
112        writer.print(b);
113    }
114
115    @Override
116    public void print(final char c) {
117        writer.print(c);
118    }
119
120    @Override
121    public void print(final char[] s) {
122        writer.print(s);
123    }
124
125    @Override
126    public void print(final double d) {
127        writer.print(d);
128    }
129
130    @Override
131    public void print(final float f) {
132        writer.print(f);
133    }
134
135    @Override
136    public void print(final int i) {
137        writer.print(i);
138    }
139
140    @Override
141    public void print(final long l) {
142        writer.print(l);
143    }
144
145    @Override
146    public void print(final Object obj) {
147        writer.print(obj);
148    }
149
150    @Override
151    public void print(final String s) {
152        writer.print(s);
153    }
154
155    @Override
156    public LoggerPrintWriter printf(final Locale l, final String format, final Object... args) {
157        writer.printf(l, format, args);
158        return this;
159    }
160
161    @Override
162    public LoggerPrintWriter printf(final String format, final Object... args) {
163        writer.printf(format, args);
164        return this;
165    }
166
167    @Override
168    public void println() {
169        writer.println();
170    }
171
172    @Override
173    public void println(final boolean x) {
174        writer.println(x);
175    }
176
177    @Override
178    public void println(final char x) {
179        writer.println(x);
180    }
181
182    @Override
183    public void println(final char[] x) {
184        writer.println(x);
185    }
186
187    @Override
188    public void println(final double x) {
189        writer.println(x);
190    }
191
192    @Override
193    public void println(final float x) {
194        writer.println(x);
195    }
196
197    @Override
198    public void println(final int x) {
199        writer.println(x);
200    }
201
202    @Override
203    public void println(final long x) {
204        writer.println(x);
205    }
206
207    @Override
208    public void println(final Object x) {
209        writer.println(x);
210    }
211
212    @Override
213    public void println(final String x) {
214        writer.println(x);
215    }
216
217    @Override
218    public String toString() {
219        return LoggerPrintWriter.class.getSimpleName() + writer.toString();
220    }
221
222    @Override
223    public void write(final char[] buf) {
224        writer.write(buf);
225    }
226
227    @Override
228    public void write(final char[] buf, final int off, final int len) {
229        writer.write(buf, off, len);
230    }
231
232    @Override
233    public void write(final int c) {
234        writer.write(c);
235    }
236
237    @Override
238    public void write(final String s) {
239        writer.write(s);
240    }
241
242    @Override
243    public void write(final String s, final int off, final int len) {
244        writer.write(s, off, len);
245    }
246}