diff --git a/PaymentServer.cabal b/PaymentServer.cabal
index a7656536887160c36898ced10c9542f4c6954112..b29d04b62e5fc4d000c50e788f836720f41335e3 100644
--- a/PaymentServer.cabal
+++ b/PaymentServer.cabal
@@ -23,6 +23,8 @@ library
                      , servant
                      , servant-server
                      , wai
+                     , wai-extra
+                     , data-default
                      , warp
                      , stripe-core
                      , text
diff --git a/src/PaymentServer/Main.hs b/src/PaymentServer/Main.hs
index 060502baef9334f81e4602d1b9b6523ca6a9cff8..cf965e608f1e8b3f4c7653f51911cbb5693dcb84 100644
--- a/src/PaymentServer/Main.hs
+++ b/src/PaymentServer/Main.hs
@@ -6,6 +6,9 @@ module PaymentServer.Main
   ( main
   ) where
 
+import Data.Default
+  ( def
+  )
 import Servant
   ( Proxy(Proxy)
   , Server
@@ -16,6 +19,14 @@ import Servant
 import Network.Wai.Handler.Warp
   ( run
   )
+import Network.Wai.Middleware.RequestLogger
+  ( OutputFormat(Detailed, CustomOutputFormatWithDetails)
+  , outputFormat
+  , mkRequestLogger
+  )
+import Network.Wai.Middleware.RequestLogger.JSON
+  ( formatAsJSON
+  )
 import PaymentServer.Persistence
   ( VoucherDatabase
   , memory
@@ -37,4 +48,8 @@ paymentServerApp :: VoucherDatabase d => d -> Application
 paymentServerApp = (serve paymentServerAPI) . paymentServer
 
 main :: IO ()
-main = memory >>= return . paymentServerApp >>= run 8081
+main = do
+  db <- memory
+  let app = paymentServerApp db
+  logger <- mkRequestLogger $ def { outputFormat = Detailed True}
+  run 8081 $ logger app