public class RequestLogImpl extends ContextBase implements org.eclipse.jetty.server.RequestLog, org.eclipse.jetty.util.component.LifeCycle, AppenderAttachable<IAccessEvent>, FilterAttachable<IAccessEvent>
It can be seen as logback classic's LoggerContext. Appenders can be attached directly to RequestLogImpl and RequestLogImpl uses the same StatusManager as LoggerContext does. It also provides containers for properties.
This RequestLogImpl only supports Jetty 7.0.0 through Jetty 10.
If you are using Jetty 11 with the new Jakarta Servlets (namespace jakarta.servlet)
then you will need a more modern version of logback-access.
Jetty 9.4.x and Jetty 10.x use a modern @{code server.setRequestLog(RequestLog)} interface that
is based on a Server level RequestLog behavior. This means all requests are logged,
even bad requests, and context-less requests. The internals of the Jetty Request and
Response objects track the state of the object at the time they are committed (the
actual state during the application when an action on the network commits the
request/response exchange). This prevents behaviors from 3rd party libraries
that change the state of the request / response before the RequestLog gets a chance
to log the details. This differs from Jetty 9.3.x and
older in that those versions used a (now deprecated) RequestLogHandler and
would never see bad requests, or context-less requests,
and if a 3rd party library modifies the the response (for example by setting
response.setStatus(200) after the response has been initiated on the network)
this change in status would be logged, instead of the actual status that was sent.
First, you must be using the proper ${jetty.home} and ${jetty.base}
directory split. Configure your ${jetty.base} with at least the `resources` module
enabled (so that your configuration can be found).
Next, create a ${jetty.base}/etc/logback-access-requestlog.xml file with the following
content.
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Set name="requestLog">
<New id="LogbackAccess" class="ch.qos.logback.access.jetty.RequestLogImpl">
<Set name="resource">logback-access.xml</Set>
</New>
</Set>
</Configure>
Now you'll need a ${jetty.base}/resources/logback-access.xml configuration file.
RequestLogImpl looks for a logback configuration file called
etc/logback-access.xml, in the ${jetty.base} directory, then
the older ${jetty.home} directory.
The logback-access.xml file is slightly
different than the usual logback classic configuration file. Most of it is
the same: Appenders and Layouts are declared the exact same way. However,
loggers elements are not allowed. It is possible to put the logback configuration file anywhere, as long as it's path is specified. Here is another example, with a path to the logback-access.xml file.
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Set name="requestLog">
<New id="LogbackAccess" class="ch.qos.logback.access.jetty.RequestLogImpl">
<Set name="fileName">/path/to/logback-access.xml</Set>
</New>
</Set>
</Configure>
To configure these older Jetty instances to use RequestLogImpl,
the use of the RequestLogHandler is the technique available to you.
Modify your etc/jetty-requestlog.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Ref id="Handlers">
<Call name="addHandler">
<Arg>
<New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler">
<Set name="requestLog">
<New id="RequestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl"/>
</Set>
</New>
</Arg>
</Call>
</Ref>
</Configure>
By default, RequestLogImpl looks for a logback configuration file called
logback-access.xml, in the same folder where jetty.xml is located, that is
etc/logback-access.xml. The logback-access.xml file is slightly
different than the usual logback classic configuration file. Most of it is
the same: Appenders and Layouts are declared the exact same way. However,
loggers elements are not allowed. It is possible to put the logback configuration file anywhere, as long as it's path is specified. Here is another example, with a path to the logback-access.xml file.
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Ref id="Handlers">
<Call name="addHandler">
<Arg>
<New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler">
<Set name="requestLog">
<New id="RequestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl">
<Set name="fileName">path/to/logback-access.xml</Set>
</New>
</Set>
</New>
</Arg>
</Call>
</Ref>
</Configure>
Here is a sample logback-access.xml file that can be used right away:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.access.PatternLayout">
<param name="Pattern" value="%date %server %remoteIP %clientHost %user %requestURL" />
</layout>
</appender>
<appender-ref ref="STDOUT" />
</configuration>
Another configuration file, using SMTPAppender, could be:
<configuration>
<appender name="SMTP" class="ch.qos.logback.access.net.SMTPAppender">
<layout class="ch.qos.logback.access.PatternLayout">
<param name="pattern" value="%remoteIP [%date] %requestURL %statusCode %bytesSent" />
</layout>
<param name="From" value="sender@domaine.org" />
<param name="SMTPHost" value="mail.domain.org" />
<param name="Subject" value="Last Event: %statusCode %requestURL" />
<param name="To" value="server_admin@domain.org" />
</appender>
<appender-ref ref="SMTP" />
</configuration>
| Modifier and Type | Field and Description |
|---|---|
static String |
DEFAULT_CONFIG_FILE |
scheduledFutures| Constructor and Description |
|---|
RequestLogImpl() |
| Modifier and Type | Method and Description |
|---|---|
void |
addAppender(Appender<IAccessEvent> newAppender) |
void |
addFilter(Filter<IAccessEvent> newFilter) |
protected void |
addInfo(String msg) |
void |
addLifeCycleListener(org.eclipse.jetty.util.component.LifeCycle.Listener listener) |
void |
clearAllFilters() |
protected void |
configure() |
void |
detachAndStopAllAppenders() |
boolean |
detachAppender(Appender<IAccessEvent> appender) |
boolean |
detachAppender(String name) |
Appender<IAccessEvent> |
getAppender(String name) |
protected URL |
getConfigurationFileURL() |
List<Filter<IAccessEvent>> |
getCopyOfAttachedFiltersList() |
FilterReply |
getFilterChainDecision(IAccessEvent event) |
boolean |
isAttached(Appender<IAccessEvent> appender) |
boolean |
isFailed() |
boolean |
isQuiet() |
boolean |
isRunning() |
boolean |
isStarted() |
boolean |
isStarting() |
boolean |
isStopped() |
boolean |
isStopping() |
Iterator<Appender<IAccessEvent>> |
iteratorForAppenders() |
void |
log(org.eclipse.jetty.server.Request jettyRequest,
org.eclipse.jetty.server.Response jettyResponse) |
void |
removeLifeCycleListener(org.eclipse.jetty.util.component.LifeCycle.Listener listener) |
void |
setFileName(String fileName) |
void |
setQuiet(boolean quiet) |
void |
setResource(String resource) |
void |
start() |
void |
stop() |
addScheduledFuture, getBirthTime, getConfigurationLock, getCopyOfPropertyMap, getExecutorService, getName, getObject, getProperty, getScheduledExecutorService, getScheduledFutures, getStatusManager, initCollisionMaps, putObject, putProperty, register, removeObject, reset, setName, setStatusManager, toStringpublic static final String DEFAULT_CONFIG_FILE
public void log(org.eclipse.jetty.server.Request jettyRequest,
org.eclipse.jetty.server.Response jettyResponse)
log in interface org.eclipse.jetty.server.RequestLogprotected void addInfo(String msg)
public void start()
start in interface LifeCyclestart in class ContextBaseprotected void configure()
protected URL getConfigurationFileURL()
public void stop()
stop in interface LifeCyclestop in class ContextBasepublic boolean isRunning()
public void setFileName(String fileName)
public void setResource(String resource)
public boolean isStarted()
isStarted in interface LifeCycleisStarted in class ContextBasepublic boolean isStarting()
public boolean isStopping()
public boolean isStopped()
public boolean isFailed()
public boolean isQuiet()
public void setQuiet(boolean quiet)
public void addAppender(Appender<IAccessEvent> newAppender)
addAppender in interface AppenderAttachable<IAccessEvent>public Iterator<Appender<IAccessEvent>> iteratorForAppenders()
iteratorForAppenders in interface AppenderAttachable<IAccessEvent>public Appender<IAccessEvent> getAppender(String name)
getAppender in interface AppenderAttachable<IAccessEvent>public boolean isAttached(Appender<IAccessEvent> appender)
isAttached in interface AppenderAttachable<IAccessEvent>public void detachAndStopAllAppenders()
detachAndStopAllAppenders in interface AppenderAttachable<IAccessEvent>public boolean detachAppender(Appender<IAccessEvent> appender)
detachAppender in interface AppenderAttachable<IAccessEvent>public boolean detachAppender(String name)
detachAppender in interface AppenderAttachable<IAccessEvent>public void addFilter(Filter<IAccessEvent> newFilter)
addFilter in interface FilterAttachable<IAccessEvent>public void clearAllFilters()
clearAllFilters in interface FilterAttachable<IAccessEvent>public List<Filter<IAccessEvent>> getCopyOfAttachedFiltersList()
getCopyOfAttachedFiltersList in interface FilterAttachable<IAccessEvent>public FilterReply getFilterChainDecision(IAccessEvent event)
getFilterChainDecision in interface FilterAttachable<IAccessEvent>public void addLifeCycleListener(org.eclipse.jetty.util.component.LifeCycle.Listener listener)
public void removeLifeCycleListener(org.eclipse.jetty.util.component.LifeCycle.Listener listener)
Copyright © 2005–2023 QOS.ch. All rights reserved.