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.ByteArrayOutputStream; 021import java.io.IOException; 022import java.io.OutputStream; 023import java.io.PrintStream; 024import java.io.UnsupportedEncodingException; 025import java.nio.charset.Charset; 026import java.util.Locale; 027 028import org.apache.logging.log4j.Level; 029import org.apache.logging.log4j.Marker; 030import org.apache.logging.log4j.io.internal.InternalPrintStream; 031import org.apache.logging.log4j.spi.ExtendedLogger; 032 033/** 034 * Logs each line written to a pre-defined level. Can also be configured with a Marker. This class provides an interface 035 * that follows the {@link java.io.PrintStream} methods in spirit, but doesn't require output to any external stream. 036 * This class should <em>not</em> be used as a stream for an underlying logger unless it's being used as a bridge. 037 * Otherwise, infinite loops may occur! 038 * 039 * @since 2.1 040 */ 041public class LoggerPrintStream extends PrintStream { 042 private static final String FQCN = LoggerPrintStream.class.getName(); 043 private final InternalPrintStream psLogger; 044 045 protected LoggerPrintStream(final ExtendedLogger logger, final boolean autoFlush, final Charset charset, 046 final String fqcn, final Level level, final Marker marker) 047 throws UnsupportedEncodingException { 048 super(new PrintStream(new ByteArrayOutputStream())); 049 psLogger = new InternalPrintStream(logger, autoFlush, charset, fqcn == null ? FQCN : fqcn, level, marker); 050 } 051 052 protected LoggerPrintStream(final OutputStream out, final boolean autoFlush, final Charset charset, 053 final ExtendedLogger logger, final String fqcn, final Level level, final Marker marker) 054 throws UnsupportedEncodingException { 055 super(new PrintStream(out)); 056 psLogger = new InternalPrintStream(out, autoFlush, charset, logger, fqcn == null ? FQCN : fqcn, level, marker); 057 } 058 059 private static Charset ensureNonNull(final Charset charset) { 060 return charset == null ? Charset.defaultCharset() : charset; 061 } 062 063 @Override 064 public LoggerPrintStream append(final char c) { 065 psLogger.append(c); 066 return this; 067 } 068 069 @Override 070 public LoggerPrintStream append(final CharSequence csq) { 071 psLogger.append(csq); 072 return this; 073 } 074 075 @Override 076 public LoggerPrintStream append(final CharSequence csq, final int start, final int end) { 077 psLogger.append(csq, start, end); 078 return this; 079 } 080 081 @Override 082 public boolean checkError() { 083 return psLogger.checkError(); 084 } 085 086 @Override 087 public void close() { 088 psLogger.close(); 089 } 090 091 @Override 092 public void flush() { 093 psLogger.flush(); 094 } 095 096 @Override 097 public LoggerPrintStream format(final Locale l, final String format, final Object... args) { 098 psLogger.format(l, format, args); 099 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}