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