Class RequestLogImpl

java.lang.Object
ch.qos.logback.core.ContextBase
ch.qos.logback.access.jetty.RequestLogImpl
All Implemented Interfaces:
ch.qos.logback.core.Context, ch.qos.logback.core.spi.AppenderAttachable<IAccessEvent>, ch.qos.logback.core.spi.FilterAttachable<IAccessEvent>, ch.qos.logback.core.spi.LifeCycle, ch.qos.logback.core.spi.PropertyContainer, org.eclipse.jetty.server.RequestLog, org.eclipse.jetty.util.component.LifeCycle

public class RequestLogImpl extends ch.qos.logback.core.ContextBase implements org.eclipse.jetty.util.component.LifeCycle, org.eclipse.jetty.server.RequestLog, ch.qos.logback.core.spi.AppenderAttachable<IAccessEvent>, ch.qos.logback.core.spi.FilterAttachable<IAccessEvent>
This class is logback's implementation of jetty's RequestLog interface.

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.

Supported Jetty Versions

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.

Configuring for Jetty 9.4.x through to Jetty 10.0.x

Jetty 9.4.x and Jetty 10.x use a modern org.eclipse.jetty.server.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.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.

By default, 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 place the logback configuration file anywhere, as long as it's path is specified. Here is another example, with an arbitrary 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">/arbitrary/path/to/logback-access.xml</Set>
       </New>
     </Set>
   </Configure>
 

Configuring for Jetty 7.x thru to Jetty 9.3.x

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 from 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>
 

Next is a sample logback-access.xml file printing access events on the console.

    <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>
 

Here is another configuration file, using SMTPAppender:

    <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>
 
Author:
Ceki Gülcü, Sébastien Pennec, Joakim Erdfelt
  • Field Details

  • Constructor Details

  • Method Details

    • log

      public void log(org.eclipse.jetty.server.Request jettyRequest, org.eclipse.jetty.server.Response jettyResponse)
      Specified by:
      log in interface org.eclipse.jetty.server.RequestLog
    • addInfo

      protected void addInfo(String msg)
    • addWarn

      protected void addWarn(String msg)
    • start

      public void start()
      Specified by:
      start in interface ch.qos.logback.core.spi.LifeCycle
      Specified by:
      start in interface org.eclipse.jetty.util.component.LifeCycle
      Overrides:
      start in class ch.qos.logback.core.ContextBase
    • configure

      protected void configure()
    • getConfigurationFileURL

    • stop

      public void stop()
      Specified by:
      stop in interface ch.qos.logback.core.spi.LifeCycle
      Specified by:
      stop in interface org.eclipse.jetty.util.component.LifeCycle
      Overrides:
      stop in class ch.qos.logback.core.ContextBase
    • isRunning

      public boolean isRunning()
      Specified by:
      isRunning in interface org.eclipse.jetty.util.component.LifeCycle
    • setFileName

      public void setFileName(String fileName)
    • setResource

      public void setResource(String resource)
    • isStarted

      public boolean isStarted()
      Specified by:
      isStarted in interface ch.qos.logback.core.spi.LifeCycle
      Specified by:
      isStarted in interface org.eclipse.jetty.util.component.LifeCycle
      Overrides:
      isStarted in class ch.qos.logback.core.ContextBase
    • isStarting

      public boolean isStarting()
      Specified by:
      isStarting in interface org.eclipse.jetty.util.component.LifeCycle
    • isStopping

      public boolean isStopping()
      Specified by:
      isStopping in interface org.eclipse.jetty.util.component.LifeCycle
    • isStopped

      public boolean isStopped()
      Specified by:
      isStopped in interface org.eclipse.jetty.util.component.LifeCycle
    • isFailed

      public boolean isFailed()
      Specified by:
      isFailed in interface org.eclipse.jetty.util.component.LifeCycle
    • addEventListener

      public boolean addEventListener(EventListener listener)
      Specified by:
      addEventListener in interface org.eclipse.jetty.util.component.LifeCycle
    • removeEventListener

      public boolean removeEventListener(EventListener listener)
      Specified by:
      removeEventListener in interface org.eclipse.jetty.util.component.LifeCycle
    • isQuiet

      public boolean isQuiet()
    • setQuiet

      public void setQuiet(boolean quiet)
    • addAppender

      public void addAppender(ch.qos.logback.core.Appender<IAccessEvent> newAppender)
      Specified by:
      addAppender in interface ch.qos.logback.core.spi.AppenderAttachable<IAccessEvent>
    • iteratorForAppenders

      public Iterator<ch.qos.logback.core.Appender<IAccessEvent>> iteratorForAppenders()
      Specified by:
      iteratorForAppenders in interface ch.qos.logback.core.spi.AppenderAttachable<IAccessEvent>
    • getAppender

      public ch.qos.logback.core.Appender<IAccessEvent> getAppender(String name)
      Specified by:
      getAppender in interface ch.qos.logback.core.spi.AppenderAttachable<IAccessEvent>
    • isAttached

      public boolean isAttached(ch.qos.logback.core.Appender<IAccessEvent> appender)
      Specified by:
      isAttached in interface ch.qos.logback.core.spi.AppenderAttachable<IAccessEvent>
    • detachAndStopAllAppenders

      Specified by:
      detachAndStopAllAppenders in interface ch.qos.logback.core.spi.AppenderAttachable<IAccessEvent>
    • detachAppender

      public boolean detachAppender(ch.qos.logback.core.Appender<IAccessEvent> appender)
      Specified by:
      detachAppender in interface ch.qos.logback.core.spi.AppenderAttachable<IAccessEvent>
    • detachAppender

      public boolean detachAppender(String name)
      Specified by:
      detachAppender in interface ch.qos.logback.core.spi.AppenderAttachable<IAccessEvent>
    • addFilter

      public void addFilter(ch.qos.logback.core.filter.Filter<IAccessEvent> newFilter)
      Specified by:
      addFilter in interface ch.qos.logback.core.spi.FilterAttachable<IAccessEvent>
    • clearAllFilters

      public void clearAllFilters()
      Specified by:
      clearAllFilters in interface ch.qos.logback.core.spi.FilterAttachable<IAccessEvent>
    • getCopyOfAttachedFiltersList

      public List<ch.qos.logback.core.filter.Filter<IAccessEvent>> getCopyOfAttachedFiltersList()
      Specified by:
      getCopyOfAttachedFiltersList in interface ch.qos.logback.core.spi.FilterAttachable<IAccessEvent>
    • getFilterChainDecision

      public ch.qos.logback.core.spi.FilterReply getFilterChainDecision(IAccessEvent event)
      Specified by:
      getFilterChainDecision in interface ch.qos.logback.core.spi.FilterAttachable<IAccessEvent>
    • addLifeCycleListener

      public void addLifeCycleListener(org.eclipse.jetty.util.component.LifeCycle.Listener listener)
    • removeLifeCycleListener

      public void removeLifeCycleListener(org.eclipse.jetty.util.component.LifeCycle.Listener listener)