1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender;
18
19 import org.apache.logging.log4j.core.Filter;
20 import org.apache.logging.log4j.core.Layout;
21 import org.apache.logging.log4j.core.config.plugins.Plugin;
22 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
23 import org.apache.logging.log4j.core.config.plugins.PluginElement;
24 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
25 import org.apache.logging.log4j.core.helpers.Loader;
26 import org.apache.logging.log4j.core.layout.PatternLayout;
27
28 import java.io.OutputStream;
29 import java.io.PrintStream;
30 import java.lang.reflect.Constructor;
31
32
33
34
35
36
37
38
39
40
41
42 @Plugin(name = "Console", type = "Core", elementType = "appender", printObject = true)
43 public final class ConsoleAppender extends AbstractOutputStreamAppender {
44
45 private static ConsoleManagerFactory factory = new ConsoleManagerFactory();
46
47
48
49
50 public enum Target {
51
52 SYSTEM_OUT,
53
54 SYSTEM_ERR
55 }
56
57 private ConsoleAppender(String name, Layout layout, Filter filter, OutputStreamManager manager,
58 boolean handleExceptions) {
59 super(name, layout, filter, handleExceptions, true, manager);
60 }
61
62
63
64
65
66
67
68
69
70
71
72 @PluginFactory
73 public static ConsoleAppender createAppender(@PluginElement("layout") Layout layout,
74 @PluginElement("filters") Filter filter,
75 @PluginAttr("target") String t,
76 @PluginAttr("name") String name,
77 @PluginAttr("suppressExceptions") String suppress) {
78 if (name == null) {
79 LOGGER.error("No name provided for ConsoleAppender");
80 return null;
81 }
82 if (layout == null) {
83 layout = PatternLayout.createLayout(null, null, null, null);
84 }
85 boolean handleExceptions = suppress == null ? true : Boolean.valueOf(suppress);
86 Target target = t == null ? Target.SYSTEM_OUT : Target.valueOf(t);
87 return new ConsoleAppender(name, layout, filter, getManager(target), handleExceptions);
88 }
89
90 private static OutputStreamManager getManager(Target target) {
91 String type = target.name();
92 OutputStream os = getOutputStream(target);
93 return OutputStreamManager.getManager(target.name(), new FactoryData(os, type), factory);
94 }
95
96 private static OutputStream getOutputStream(Target target) {
97 final PrintStream printStream = target == Target.SYSTEM_OUT ? System.out : System.err;
98 if (!System.getProperty("os.name").startsWith("Windows")) {
99 return printStream;
100 } else {
101 try {
102 ClassLoader loader = Loader.getClassLoader();
103
104 Class<?> clazz = loader.loadClass("org.fusesource.jansi.WindowsAnsiOutputStream");
105 Constructor<?> constructor = clazz.getConstructor(OutputStream.class);
106 return (OutputStream) constructor.newInstance(printStream);
107 } catch (ClassNotFoundException cnfe) {
108 LOGGER.debug("Jansi is not installed");
109 } catch (NoSuchMethodException nsme) {
110 LOGGER.warn("WindowsAnsiOutputStream is missing the proper constructor");
111 } catch (Exception ex) {
112 LOGGER.warn("Unable to instantiate WindowsAnsiOutputStream");
113 }
114 return printStream;
115 }
116 }
117
118
119
120
121 private static class FactoryData {
122 private OutputStream os;
123 private String type;
124
125
126
127
128
129
130 public FactoryData(OutputStream os, String type) {
131 this.os = os;
132 this.type = type;
133 }
134 }
135
136
137
138
139 private static class ConsoleManagerFactory implements ManagerFactory<OutputStreamManager, FactoryData> {
140
141
142
143
144
145
146
147 public OutputStreamManager createManager(String name, FactoryData data) {
148 return new OutputStreamManager(data.os, data.type);
149 }
150 }
151
152 }