diff --git a/Network/Wai/Logger.hs b/Network/Wai/Logger.hs
--- a/Network/Wai/Logger.hs
+++ b/Network/Wai/Logger.hs
@@ -34,8 +34,13 @@
   -- * High level functions
     ApacheLogger
   , withStdoutLogger
+  , ServerPushLogger
   -- * Creating a logger
-  , ApacheLoggerActions(..)
+  , ApacheLoggerActions
+  , apacheLogger
+  , serverpushLogger
+  , logRotator
+  , logRemover
   , initLogger
   -- * Types
   , IPAddrSource(..)
@@ -56,6 +61,7 @@
 #endif
 import Control.Exception (bracket)
 import Control.Monad (void)
+import Data.ByteString (ByteString)
 import Network.HTTP.Types (Status)
 import Network.Wai (Request)
 import System.Log.FastLogger
@@ -85,12 +91,19 @@
 -- | Apache style logger.
 type ApacheLogger = Request -> Status -> Maybe Integer -> IO ()
 
+-- | HTTP/2 server push logger in Apache style.
+type ServerPushLogger = Request -> ByteString -> Integer -> IO ()
+
+-- | Function set of Apache style logger.
 data ApacheLoggerActions = ApacheLoggerActions {
+    -- | The Apache logger.
     apacheLogger :: ApacheLogger
+    -- | The HTTP/2 server push logger.
+  , serverpushLogger :: ServerPushLogger
     -- | This is obsoleted. Rotation is done on-demand.
     --   So, this is now an empty action.
   , logRotator :: IO ()
-    -- | Removing resources relating Apache logger.
+    -- | Removing resources relating to Apache logger.
     --   E.g. flushing and deallocating internal buffers.
   , logRemover :: IO ()
   }
@@ -102,7 +115,12 @@
            -> IO ApacheLoggerActions
 initLogger ipsrc typ tgetter = do
     (fl, cleanUp) <- newFastLogger typ
-    return $ ApacheLoggerActions (apache fl ipsrc tgetter) (return ()) cleanUp
+    return $ ApacheLoggerActions {
+        apacheLogger     = apache fl ipsrc tgetter
+      , serverpushLogger = serverpush fl ipsrc tgetter
+      , logRotator       = return ()
+      , logRemover       = cleanUp
+      }
 
 --- | Checking if a log file can be written if 'LogType' is 'LogFileNoRotate' or 'LogFile'.
 logCheck :: LogType -> IO ()
@@ -119,6 +137,11 @@
 apache cb ipsrc dateget req st mlen = do
     zdata <- dateget
     cb (apacheLogStr ipsrc zdata req st mlen)
+
+serverpush :: (LogStr -> IO ()) -> IPAddrSource -> IO FormattedTime -> ServerPushLogger
+serverpush cb ipsrc dateget req path size = do
+    zdata <- dateget
+    cb (serverpushLogStr ipsrc zdata req path size)
 
 ---------------------------------------------------------------
 
diff --git a/Network/Wai/Logger/Apache.hs b/Network/Wai/Logger/Apache.hs
--- a/Network/Wai/Logger/Apache.hs
+++ b/Network/Wai/Logger/Apache.hs
@@ -3,6 +3,7 @@
 module Network.Wai.Logger.Apache (
     IPAddrSource(..)
   , apacheLogStr
+  , serverpushLogStr
   ) where
 
 #ifndef MIN_VERSION_base
@@ -69,6 +70,32 @@
     mua = requestHeaderUserAgent req
 #else
     mr  = lookup "referer" $ requestHeaders req
+    mua = lookup "user-agent" $ requestHeaders req
+#endif
+
+-- | HTTP/2 Push log format in the Apache style.
+serverpushLogStr :: IPAddrSource -> FormattedTime -> Request -> ByteString -> Integer -> LogStr
+serverpushLogStr ipsrc tmstr req path size =
+      toLogStr (getSourceIP ipsrc req)
+  <> " - - ["
+  <> toLogStr tmstr
+  <> "] \"PUSH "
+  <> toLogStr path
+  <> " HTTP/2\" 200 "
+  <> toLogStr (show size)
+  <> " \""
+  <> toLogStr ref
+  <> "\" \""
+  <> toLogStr (fromMaybe "" mua)
+  <> "\"\n"
+  where
+    ref  = rawPathInfo req
+#if !MIN_VERSION_base(4,5,0)
+    (<>) = mappend
+#endif
+#if MIN_VERSION_wai(3,2,0)
+    mua = requestHeaderUserAgent req
+#else
     mua = lookup "user-agent" $ requestHeaders req
 #endif
 
diff --git a/wai-logger.cabal b/wai-logger.cabal
--- a/wai-logger.cabal
+++ b/wai-logger.cabal
@@ -1,5 +1,5 @@
 Name:                   wai-logger
-Version:                2.2.7
+Version:                2.3.0
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
