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}