logback源码解析之ConsoleAppend
上类图
借着上一篇配置文件解析的基础文件中consoleappend的start方法为入口,咱们看一下start方法中都做了什么
@Override
public void start() {
OutputStream targetStream = target.getStream();
// enable jansi only on Windows and only if withJansi set to true
if (EnvUtil.isWindows() && withJansi) {
targetStream = getTargetStreamForWindows(targetStream);
}
setOutputStream(targetStream);
super.start();
}
start方法中第一行先通过target获取stream,那么target是从哪里来的,
target的声明如下
protected ConsoleTarget target = ConsoleTarget.SystemOut;
ConsoleTarget获取的SystemOut
接着看ConsoleTarget
public enum ConsoleTarget {
SystemOut("System.out", new OutputStream() {
@Override
public void write(int b) throws IOException {
System.out.write(b);
}
@Override
public void write(byte b[]) throws IOException {
System.out.write(b);
}
@Override
public void write(byte b[], int off, int len) throws IOException {
System.out.write(b, off, len);
}
@Override
public void flush() throws IOException {
System.out.flush();
}
}),
SystemErr("System.err", new OutputStream() {
@Override
public void write(int b) throws IOException {
System.err.write(b);
}
@Override
public void write(byte b[]) throws IOException {
System.err.write(b);
}
@Override
public void write(byte b[], int off, int len) throws IOException {
System.err.write(b, off, len);
}
@Override
public void flush() throws IOException {
System.err.flush();
}
});
public static ConsoleTarget findByName(String name) {
for (ConsoleTarget target : ConsoleTarget.values()) {
if (target.name.equalsIgnoreCase(name)) {
return target;
}
}
return null;
}
private final String name;
private final OutputStream stream;
private ConsoleTarget(String name, OutputStream stream) {
this.name = name;
this.stream = stream;
}
public String getName() {
return name;
}
public OutputStream getStream() {
return stream;
}
@Override
public String toString() {
return name;
}
}
ConsoleTarget只是一个枚举,里面定义了两个输出对象,分别是System.out和System.err