1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.access.jetty;
15
16 import java.io.File;
17 import java.util.HashMap;
18 import java.util.Iterator;
19 import java.util.List;
20
21 import ch.qos.logback.core.util.StatusPrinter;
22 import org.eclipse.jetty.server.Request;
23 import org.eclipse.jetty.server.RequestLog;
24 import org.eclipse.jetty.server.Response;
25
26
27 import ch.qos.logback.access.joran.JoranConfigurator;
28 import ch.qos.logback.access.spi.AccessEvent;
29 import ch.qos.logback.access.spi.IAccessEvent;
30 import ch.qos.logback.core.Appender;
31 import ch.qos.logback.core.ContextBase;
32 import ch.qos.logback.core.CoreConstants;
33 import ch.qos.logback.core.filter.Filter;
34 import ch.qos.logback.core.joran.spi.JoranException;
35 import ch.qos.logback.core.spi.AppenderAttachable;
36 import ch.qos.logback.core.spi.AppenderAttachableImpl;
37 import ch.qos.logback.core.spi.FilterAttachable;
38 import ch.qos.logback.core.spi.FilterAttachableImpl;
39 import ch.qos.logback.core.spi.FilterReply;
40 import ch.qos.logback.core.status.ErrorStatus;
41 import ch.qos.logback.core.status.WarnStatus;
42 import ch.qos.logback.core.util.OptionHelper;
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 public class RequestLogImpl extends ContextBase implements RequestLog,
113 AppenderAttachable<IAccessEvent>, FilterAttachable<IAccessEvent> {
114
115 public final static String DEFAULT_CONFIG_FILE = "etc" + File.separatorChar
116 + "logback-access.xml";
117
118 AppenderAttachableImpl<IAccessEvent> aai = new AppenderAttachableImpl<IAccessEvent>();
119 FilterAttachableImpl<IAccessEvent> fai = new FilterAttachableImpl<IAccessEvent>();
120 String fileName;
121 boolean started = false;
122 boolean quiet = false;
123
124 public RequestLogImpl() {
125 putObject(CoreConstants.EVALUATOR_MAP, new HashMap());
126 }
127
128 public void log(Request jettyRequest, Response jettyResponse) {
129 JettyServerAdapter adapter = new JettyServerAdapter(jettyRequest,
130 jettyResponse);
131 IAccessEvent accessEvent = new AccessEvent(jettyRequest, jettyResponse,
132 adapter);
133 if (getFilterChainDecision(accessEvent) == FilterReply.DENY) {
134 return;
135 }
136 aai.appendLoopOnAppenders(accessEvent);
137 }
138
139 public void start() {
140 if (fileName == null) {
141 String jettyHomeProperty = OptionHelper.getSystemProperty("jetty.home");
142 if (OptionHelper.isEmpty(jettyHomeProperty)) {
143 getStatusManager().add(
144 new WarnStatus("[jetty.home] system property not set.", this));
145 fileName = DEFAULT_CONFIG_FILE;
146 } else {
147 fileName = jettyHomeProperty + File.separatorChar + DEFAULT_CONFIG_FILE;
148 }
149 getStatusManager().add(
150 new WarnStatus("fileName property not set. Assuming [" + fileName
151 + "]", this));
152 }
153 File configFile = new File(fileName);
154 if (configFile.exists()) {
155 runJoranOnFile(configFile);
156 } else {
157 getStatusManager().add(
158 new ErrorStatus("Could not find logback-access configuration file [" + fileName + "]", this));
159 }
160 if (!isQuiet()) {
161 StatusPrinter.print(getStatusManager());
162 }
163 started = true;
164 }
165
166 private void runJoranOnFile(File configFile) {
167 try {
168 JoranConfigurator jc = new JoranConfigurator();
169 jc.setContext(this);
170 jc.doConfigure(configFile);
171 if (getName() == null) {
172 setName("LogbackRequestLog");
173 }
174 } catch (JoranException e) {
175
176 }
177 }
178
179 public void stop() {
180 aai.detachAndStopAllAppenders();
181 started = false;
182 }
183
184 public boolean isRunning() {
185 return started;
186 }
187
188 public void setFileName(String fileName) {
189 this.fileName = fileName;
190 }
191
192 public boolean isStarted() {
193 return started;
194 }
195
196 public boolean isStarting() {
197 return false;
198 }
199
200 public boolean isStopping() {
201 return false;
202 }
203
204 public boolean isStopped() {
205 return !started;
206 }
207
208 public boolean isFailed() {
209 return false;
210 }
211
212 public boolean isQuiet() {
213 return quiet;
214 }
215
216 public void setQuiet(boolean quiet) {
217 this.quiet = quiet;
218 }
219
220 public void addAppender(Appender<IAccessEvent> newAppender) {
221 aai.addAppender(newAppender);
222 }
223
224 public Iterator<Appender<IAccessEvent>> iteratorForAppenders() {
225 return aai.iteratorForAppenders();
226 }
227
228 public Appender<IAccessEvent> getAppender(String name) {
229 return aai.getAppender(name);
230 }
231
232 public boolean isAttached(Appender<IAccessEvent> appender) {
233 return aai.isAttached(appender);
234 }
235
236 public void detachAndStopAllAppenders() {
237 aai.detachAndStopAllAppenders();
238
239 }
240
241 public boolean detachAppender(Appender<IAccessEvent> appender) {
242 return aai.detachAppender(appender);
243 }
244
245 public boolean detachAppender(String name) {
246 return aai.detachAppender(name);
247 }
248
249 public void addFilter(Filter<IAccessEvent> newFilter) {
250 fai.addFilter(newFilter);
251 }
252
253 public void clearAllFilters() {
254 fai.clearAllFilters();
255 }
256
257 public List<Filter<IAccessEvent>> getCopyOfAttachedFiltersList() {
258 return fai.getCopyOfAttachedFiltersList();
259 }
260
261 public FilterReply getFilterChainDecision(IAccessEvent event) {
262 return fai.getFilterChainDecision(event);
263 }
264
265 public void addLifeCycleListener(Listener listener) {
266
267 }
268
269 public void removeLifeCycleListener(Listener listener) {
270
271 }
272
273 }