1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.web.appender;
18
19 import java.io.Serializable;
20
21 import javax.servlet.ServletContext;
22
23 import org.apache.logging.log4j.core.Filter;
24 import org.apache.logging.log4j.core.Layout;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.appender.AbstractAppender;
27 import org.apache.logging.log4j.core.config.plugins.Plugin;
28 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
29 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
30 import org.apache.logging.log4j.core.layout.AbstractStringLayout;
31 import org.apache.logging.log4j.core.layout.PatternLayout;
32 import org.apache.logging.log4j.web.WebLoggerContextUtils;
33
34
35
36
37 @Plugin(name = "Servlet", category = "Core", elementType = "appender", printObject = true)
38 public class ServletAppender extends AbstractAppender {
39
40 public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
41 implements org.apache.logging.log4j.core.util.Builder<ServletAppender> {
42
43 @PluginBuilderAttribute
44 private boolean logThrowables;
45
46 @Override
47 public ServletAppender build() {
48 final String name = getName();
49 if (name == null) {
50 LOGGER.error("No name provided for ServletAppender");
51 }
52 final ServletContext servletContext = WebLoggerContextUtils.getServletContext();
53 if (servletContext == null) {
54 LOGGER.error("No servlet context is available");
55 return null;
56 }
57 Layout<? extends Serializable> layout = getLayout();
58 if (layout == null) {
59 layout = PatternLayout.createDefaultLayout();
60 } else if (!(layout instanceof AbstractStringLayout)) {
61 LOGGER.error("Layout must be a StringLayout to log to ServletContext");
62 return null;
63 }
64 return new ServletAppender(name, layout, getFilter(), servletContext, isIgnoreExceptions(), logThrowables);
65 }
66
67
68
69
70
71
72 public boolean isLogThrowables() {
73 return logThrowables;
74 }
75
76
77
78
79 public void setLogThrowables(final boolean logThrowables) {
80 this.logThrowables = logThrowables;
81 }
82
83 }
84
85 @PluginBuilderFactory
86 public static <B extends Builder<B>> B newBuilder() {
87 return new Builder<B>().asBuilder();
88 }
89
90 private final ServletContext servletContext;
91 private final boolean logThrowables;
92
93 private ServletAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
94 final ServletContext servletContext, final boolean ignoreExceptions, final boolean logThrowables) {
95 super(name, filter, layout, ignoreExceptions);
96 this.servletContext = servletContext;
97 this.logThrowables = logThrowables;
98 }
99
100 @Override
101 public void append(final LogEvent event) {
102 final String serialized = ((AbstractStringLayout) getLayout()).toSerializable(event);
103 if (logThrowables) {
104 servletContext.log(serialized, event.getThrown());
105 } else {
106 servletContext.log(serialized);
107 }
108 }
109
110
111
112
113
114
115
116
117
118
119
120 @Deprecated
121 public static ServletAppender createAppender(final Layout<? extends Serializable> layout, final Filter filter,
122 final String name, final boolean ignoreExceptions) {
123
124 return newBuilder()
125 .withFilter(filter)
126 .withIgnoreExceptions(ignoreExceptions)
127 .withLayout(layout)
128 .withName(name)
129 .build();
130
131 }
132
133 }