diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for wai-extra
 
+## 3.1.8
+
+* Added an `ApacheWithSettings` output format for `RequestLogger` that allows request filtering similar to `DetailedWithSettings` and logging of the current user via wai-logger's `initLoggerUser` [#866](https://github.com/yesodweb/wai/pull/866)
+
 ## 3.1.7
 
 * Added new `mPrelogRequests` option to `DetailedSettings` [#857](https://github.com/yesodweb/wai/pull/857)
diff --git a/Network/Wai/Middleware/RequestLogger.hs b/Network/Wai/Middleware/RequestLogger.hs
--- a/Network/Wai/Middleware/RequestLogger.hs
+++ b/Network/Wai/Middleware/RequestLogger.hs
@@ -9,11 +9,17 @@
       -- * Create more versions
     , mkRequestLogger
     , RequestLoggerSettings
+    , defaultRequestLoggerSettings
     , outputFormat
     , autoFlush
     , destination
     , OutputFormat (..)
-    , DetailedSettings(..)
+    , ApacheSettings
+    , defaultApacheSettings
+    , setApacheIPAddrSource
+    , setApacheRequestFilter
+    , setApacheUserGetter
+    , DetailedSettings (..)
     , OutputFormatter
     , OutputFormatterWithDetails
     , OutputFormatterWithDetailsAndHeaders
@@ -51,16 +57,65 @@
 import Network.Wai.Middleware.RequestLogger.Internal
 import Network.Wai.Header (contentLength)
 import Data.Text.Encoding (decodeUtf8')
+import Network.Wai (Request)
 
 -- | The logging format.
 data OutputFormat
   = Apache IPAddrSource
+  | ApacheWithSettings ApacheSettings -- ^ @since 3.1.8
   | Detailed Bool -- ^ use colors?
   | DetailedWithSettings DetailedSettings -- ^ @since 3.1.3
   | CustomOutputFormat OutputFormatter
   | CustomOutputFormatWithDetails OutputFormatterWithDetails
   | CustomOutputFormatWithDetailsAndHeaders OutputFormatterWithDetailsAndHeaders
 
+-- | Settings for the `ApacheWithSettings` `OutputFormat`. This is purposely kept as an abstract data
+-- type so that new settings can be added without breaking backwards
+-- compatibility. In order to create an 'ApacheSettings' value, use 'defaultApacheSettings'
+-- and the various \'setApache\' functions to modify individual fields. For example:
+--
+-- > setApacheIPAddrSource FromHeader defaultApacheSettings
+--
+-- @since 3.1.8
+data ApacheSettings = ApacheSettings
+    { apacheIPAddrSource :: IPAddrSource
+    , apacheUserGetter :: Request -> Maybe BS.ByteString
+    , apacheRequestFilter :: Request -> Response -> Bool
+    }
+
+defaultApacheSettings :: ApacheSettings
+defaultApacheSettings = ApacheSettings
+    { apacheIPAddrSource = FromSocket
+    , apacheRequestFilter = \_ _ -> True
+    , apacheUserGetter = \_ -> Nothing
+    }
+
+-- | Where to take IP addresses for clients from. See 'IPAddrSource' for more information.
+--
+-- Default value: FromSocket
+--
+-- @since 3.1.8
+setApacheIPAddrSource :: IPAddrSource -> ApacheSettings -> ApacheSettings
+setApacheIPAddrSource x y = y { apacheIPAddrSource = x }
+
+-- | Function that allows you to filter which requests are logged, based on
+-- the request and response
+--
+-- Default: log all requests
+--
+-- @since 3.1.8
+setApacheRequestFilter :: (Request -> Response -> Bool) -> ApacheSettings -> ApacheSettings
+setApacheRequestFilter x y = y { apacheRequestFilter = x }
+
+-- | Function that allows you to get the current user from the request, which
+-- will then be added in the log.
+--
+-- Default: return no user
+--
+-- @since 3.1.8
+setApacheUserGetter :: (Request -> Maybe BS.ByteString) -> ApacheSettings -> ApacheSettings
+setApacheUserGetter x y = y { apacheUserGetter = x }
+
 -- | Settings for the `Detailed` `OutputFormat`.
 --
 -- `mModifyParams` allows you to pass a function to hide confidential
@@ -141,12 +196,15 @@
     , destination :: Destination
     }
 
+defaultRequestLoggerSettings :: RequestLoggerSettings
+defaultRequestLoggerSettings = RequestLoggerSettings
+    { outputFormat = Detailed True
+    , autoFlush = True
+    , destination = Handle stdout
+    }
+
 instance Default RequestLoggerSettings where
-    def = RequestLoggerSettings
-        { outputFormat = Detailed True
-        , autoFlush = True
-        , destination = Handle stdout
-        }
+    def = defaultRequestLoggerSettings
 
 mkRequestLogger :: RequestLoggerSettings -> IO Middleware
 mkRequestLogger RequestLoggerSettings{..} = do
@@ -160,7 +218,11 @@
         Apache ipsrc -> do
             getdate <- getDateGetter flusher
             apache <- initLogger ipsrc (LogCallback callback flusher) getdate
-            return $ apacheMiddleware apache
+            return $ apacheMiddleware (\_ _ -> True) apache
+        ApacheWithSettings ApacheSettings{..} -> do
+            getdate <- getDateGetter flusher
+            apache <- initLoggerUser (Just apacheUserGetter) apacheIPAddrSource (LogCallback callback flusher) getdate
+            return $ apacheMiddleware apacheRequestFilter apache
         Detailed useColors ->
             let settings = def { useColors = useColors}
             in detailedMiddleware callbackAndFlush settings
@@ -176,10 +238,10 @@
             getdate <- getDateGetter flusher
             return $ customMiddlewareWithDetailsAndHeaders callbackAndFlush getdate formatter
 
-apacheMiddleware :: ApacheLoggerActions -> Middleware
-apacheMiddleware ala app req sendResponse = app req $ \res -> do
-    let msize = contentLength (responseHeaders res)
-    apacheLogger ala req (responseStatus res) msize
+apacheMiddleware :: (Request -> Response -> Bool) -> ApacheLoggerActions -> Middleware
+apacheMiddleware applyRequestFilter ala app req sendResponse = app req $ \res -> do
+    when (applyRequestFilter req res) $
+        apacheLogger ala req (responseStatus res) $ contentLength (responseHeaders res)
     sendResponse res
 
 customMiddleware :: Callback -> IO ZonedDate -> OutputFormatter -> Middleware
diff --git a/wai-extra.cabal b/wai-extra.cabal
--- a/wai-extra.cabal
+++ b/wai-extra.cabal
@@ -1,5 +1,5 @@
 Name:                wai-extra
-Version:             3.1.7
+Version:             3.1.8
 Synopsis:            Provides some basic WAI handlers and middleware.
 description:
   Provides basic WAI handler and middleware functionality:
@@ -99,7 +99,7 @@
                    , case-insensitive          >= 0.2
                    , data-default-class
                    , fast-logger               >= 2.4.5
-                   , wai-logger                >= 2.3.2
+                   , wai-logger                >= 2.3.7
                    , ansi-terminal
                    , resourcet                 >= 0.4.6    && < 1.3
                    , containers
