diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# log-base-0.9.1.0 (2021-03-01)
+* Add a `LogList` logger
+
 # log-base-0.9.0.0 (2020-09-07)
 * Always make data attached to a log message a json object
 * Add unliftio-core-0.2 compatiblity
diff --git a/log-base.cabal b/log-base.cabal
--- a/log-base.cabal
+++ b/log-base.cabal
@@ -1,5 +1,5 @@
 name:                log-base
-version:             0.9.0.0
+version:             0.9.1.0
 synopsis:            Structured logging solution (base package)
 
 description:         A library that provides a way to record structured log
@@ -21,7 +21,7 @@
 build-type:          Simple
 cabal-version:       >=1.10
 extra-source-files:  CHANGELOG.md, README.md
-tested-with:         GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.2
+tested-with:         GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.4
 
 Source-repository head
   Type:     git
@@ -29,6 +29,7 @@
 
 library
   exposed-modules:     Log,
+                       Log.Backend.LogList,
                        Log.Backend.StandardOutput,
                        Log.Backend.StandardOutput.Bulk,
                        Log.Backend.Text,
diff --git a/src/Log/Backend/LogList.hs b/src/Log/Backend/LogList.hs
new file mode 100644
--- /dev/null
+++ b/src/Log/Backend/LogList.hs
@@ -0,0 +1,43 @@
+-- | LogList logging backed.
+module Log.Backend.LogList
+  ( LogList
+  , newLogList
+  , getLogList
+  , putLogList
+  , clearLogList
+  , withLogListLogger
+  ) where
+
+import Control.Concurrent.MVar
+import System.IO
+import Prelude
+
+import Log.Data
+import Log.Internal.Logger
+
+newtype LogList = LogList (MVar [LogMessage])
+  deriving Eq
+
+-- | Create a new, empty list.
+newLogList :: IO LogList
+newLogList = LogList <$> newMVar []
+
+-- | Retrieve messages stored in the list.
+getLogList :: LogList -> IO [LogMessage]
+getLogList (LogList ll) = reverse <$> readMVar ll
+
+-- | Put a message into the list.
+putLogList :: LogList -> LogMessage -> IO ()
+putLogList (LogList ll) msg = modifyMVar_ ll $ \msgs -> return $! msg : msgs
+
+-- | Clear the list.
+clearLogList :: LogList -> IO ()
+clearLogList (LogList ll) = modifyMVar_ ll . const $ return []
+
+-- | Creates a logger that stores messages in the given 'LogList'.
+withLogListLogger :: LogList -> (Logger -> IO r) -> IO r
+withLogListLogger ll = withLogger $ Logger
+  { loggerWriteMessage = putLogList ll
+  , loggerWaitForWrite = return ()
+  , loggerShutdown     = return ()
+  }
