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 org.mortbay.jetty.Request;
22 import org.mortbay.jetty.RequestLog;
23 import org.mortbay.jetty.Response;
24
25 import ch.qos.logback.access.joran.JoranConfigurator;
26 import ch.qos.logback.access.spi.AccessEvent;
27 import ch.qos.logback.core.Appender;
28 import ch.qos.logback.core.ContextBase;
29 import ch.qos.logback.core.CoreConstants;
30 import ch.qos.logback.core.filter.Filter;
31 import ch.qos.logback.core.joran.spi.JoranException;
32 import ch.qos.logback.core.spi.AppenderAttachable;
33 import ch.qos.logback.core.spi.AppenderAttachableImpl;
34 import ch.qos.logback.core.spi.FilterAttachable;
35 import ch.qos.logback.core.spi.FilterAttachableImpl;
36 import ch.qos.logback.core.spi.FilterReply;
37 import ch.qos.logback.core.status.ErrorStatus;
38 import ch.qos.logback.core.status.InfoStatus;
39 import ch.qos.logback.core.status.WarnStatus;
40 import ch.qos.logback.core.util.OptionHelper;
41
42
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 public class RequestLogImpl extends ContextBase implements RequestLog,
111 AppenderAttachable<AccessEvent>, FilterAttachable<AccessEvent> {
112
113 public final static String DEFAULT_CONFIG_FILE = "etc" + File.separatorChar
114 + "logback-access.xml";
115
116 AppenderAttachableImpl<AccessEvent> aai = new AppenderAttachableImpl<AccessEvent>();
117 FilterAttachableImpl<AccessEvent> fai = new FilterAttachableImpl<AccessEvent>();
118 String filename;
119 boolean started = false;
120
121 public RequestLogImpl() {
122 putObject(CoreConstants.EVALUATOR_MAP, new HashMap());
123 }
124
125 public void log(Request jettyRequest, Response jettyResponse) {
126 JettyServerAdapter adapter = new JettyServerAdapter(jettyRequest,
127 jettyResponse);
128 AccessEvent accessEvent = new AccessEvent(jettyRequest, jettyResponse,
129 adapter);
130 if (getFilterChainDecision(accessEvent) == FilterReply.DENY) {
131 return;
132 }
133 aai.appendLoopOnAppenders(accessEvent);
134 }
135
136 public void start() {
137 if (filename == null) {
138 String jettyHomeProperty = OptionHelper.getSystemProperty("jetty.home");
139
140 filename = jettyHomeProperty + File.separatorChar + DEFAULT_CONFIG_FILE;
141 getStatusManager().add(
142 new WarnStatus("filename property not set. Assuming [" + filename
143 + "]", this));
144
145 }
146 try {
147 File configFile = new File(filename);
148 if (configFile.exists()) {
149 JoranConfigurator jc = new JoranConfigurator();
150 jc.setContext(this);
151 jc.doConfigure(filename);
152
153 } else {
154 getStatusManager().add(
155 new ErrorStatus("[" + filename + "] does not exist", this));
156 }
157
158 if (getName() == null) {
159 setName("LogbackRequestLog");
160 }
161 RequestLogRegistry.register(this);
162 getStatusManager().add(
163 new InfoStatus("RequestLog added to RequestLogRegistry with name: "
164 + getName(), this));
165
166 started = true;
167
168 } catch (JoranException e) {
169
170 }
171 }
172
173 public void stop() {
174 aai.detachAndStopAllAppenders();
175 started = false;
176 }
177
178 public boolean isRunning() {
179 return started;
180 }
181
182 public void setFileName(String filename) {
183 this.filename = filename;
184 }
185
186 public boolean isStarted() {
187 return started;
188 }
189
190 public boolean isStarting() {
191 return false;
192 }
193
194 public boolean isStopping() {
195 return false;
196 }
197
198 public boolean isStopped() {
199 return !started;
200 }
201
202 public boolean isFailed() {
203 return false;
204 }
205
206 public void addAppender(Appender<AccessEvent> newAppender) {
207 aai.addAppender(newAppender);
208 }
209
210 public Iterator<Appender<AccessEvent>> iteratorForAppenders() {
211 return aai.iteratorForAppenders();
212 }
213
214 public Appender<AccessEvent> getAppender(String name) {
215 return aai.getAppender(name);
216 }
217
218 public boolean isAttached(Appender<AccessEvent> appender) {
219 return aai.isAttached(appender);
220 }
221
222 public void detachAndStopAllAppenders() {
223 aai.detachAndStopAllAppenders();
224
225 }
226
227 public boolean detachAppender(Appender<AccessEvent> appender) {
228 return aai.detachAppender(appender);
229 }
230
231 public boolean detachAppender(String name) {
232 return aai.detachAppender(name);
233 }
234
235 public void addFilter(Filter<AccessEvent> newFilter) {
236 fai.addFilter(newFilter);
237 }
238
239 public void clearAllFilters() {
240 fai.clearAllFilters();
241 }
242
243 public List<Filter<AccessEvent>> getCopyOfAttachedFiltersList() {
244 return fai.getCopyOfAttachedFiltersList();
245 }
246
247 public FilterReply getFilterChainDecision(AccessEvent event) {
248 return fai.getFilterChainDecision(event);
249 }
250
251 }