diff --git a/Control/Logging.hs b/Control/Logging.hs
--- a/Control/Logging.hs
+++ b/Control/Logging.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE RankNTypes #-}
+
 {-# OPTIONS_GHC -Wall -fno-warn-orphans #-}
 
 -- | Quick example of how to use this module:
@@ -51,9 +53,13 @@
     , timedDebugEndS
     , timedDebugEndS'
     , withStdoutLogging
+    , withStdoutLoggingUsing
     , withStderrLogging
+    , withStderrLoggingUsing
     , withFileLogging
+    , withFileLoggingUsing
     , flushLog
+    , LoggingLogger
     , loggingLogger
     , setLogLevel
     , setLogTimeFormat
@@ -116,6 +122,9 @@
         . encodeUtf8
         . T.pack
 
+newtype LoggingLogger = LoggingLogger
+  { getLoggingLogger :: ToLogStr msg => Loc -> LogSource -> LogLevel -> msg -> IO () }
+
 -- | This function is used to implement 'monadLoggerLog' for the IO instance.
 --   You may reuse it if you wish, or it can be passed as an argument to
 --   'runLoggingT' -- in which case you must remember to call 'flushLog'
@@ -150,30 +159,64 @@
     renderLevel LevelError = "[ERROR]"
     renderLevel (LevelOther txt) = "[" ++ unpack txt ++ "]"
 
+logFunction :: IORef LoggingLogger
+{-# NOINLINE logFunction #-}
+logFunction = unsafePerformIO $ newIORef (LoggingLogger loggingLogger)
+
 -- | This function, or 'withStderrLogging', must be wrapped around whatever
 --   region of your application intends to use logging.  Typically it would be
 --   wrapped around the body of 'main'.
 withStdoutLogging :: (MonadBaseControl IO m, MonadIO m) => m a -> m a
 withStdoutLogging f = do
     liftIO $ do
+        writeIORef logFunction (LoggingLogger loggingLogger)
         set <- newStdoutLoggerSet defaultBufSize
         atomicWriteIORef logSet set
     f `finally` flushLog
 
+withStdoutLoggingUsing :: (MonadBaseControl IO m, MonadIO m)
+                       => LoggingLogger -> m a -> m a
+withStdoutLoggingUsing logf f = do
+    liftIO $ do
+        writeIORef logFunction logf
+        set <- newStdoutLoggerSet defaultBufSize
+        atomicWriteIORef logSet set
+    f `finally` flushLog
+
 withStderrLogging :: (MonadBaseControl IO m, MonadIO m) => m a -> m a
 withStderrLogging f = do
     liftIO $ do
+        writeIORef logFunction (LoggingLogger loggingLogger)
         set <- newStderrLoggerSet defaultBufSize
         atomicWriteIORef logSet set
     f `finally` flushLog
 
+withStderrLoggingUsing :: (MonadBaseControl IO m, MonadIO m)
+                       => LoggingLogger -> m a -> m a
+withStderrLoggingUsing logf f = do
+    liftIO $ do
+        writeIORef logFunction logf
+        set <- newStderrLoggerSet defaultBufSize
+        atomicWriteIORef logSet set
+    f `finally` flushLog
+
 withFileLogging :: (MonadBaseControl IO m, MonadIO m) => FilePath -> m a -> m a
 withFileLogging path f = do
     liftIO $ do
+        writeIORef logFunction (LoggingLogger loggingLogger)
         set <- newFileLoggerSet defaultBufSize path
         atomicWriteIORef logSet set
     f `finally` flushLog
 
+withFileLoggingUsing :: (MonadBaseControl IO m, MonadIO m)
+                     => LoggingLogger -> FilePath -> m a -> m a
+withFileLoggingUsing logf path f = do
+    liftIO $ do
+        writeIORef logFunction logf
+        set <- newFileLoggerSet defaultBufSize path
+        atomicWriteIORef logSet set
+    f `finally` flushLog
+
 -- | Flush all collected logging messages.  This is automatically called by
 --   'withStdoutLogging' and 'withStderrLogging' when those blocks are exited
 --   by whatever means.
@@ -183,7 +226,9 @@
     flushLogStr set
 
 instance MonadLogger IO where
-    monadLoggerLog = loggingLogger
+    monadLoggerLog a b c d = do
+        logf <- readIORef logFunction
+        getLoggingLogger logf a b c d
 
 -- | Synonym for 'Control.Monad.Logger.logInfoN'.  This module provides a
 --   'MonadLogger' instance for IO, so this function can be used directly in
diff --git a/logging.cabal b/logging.cabal
--- a/logging.cabal
+++ b/logging.cabal
@@ -1,5 +1,5 @@
 Name:                logging
-Version:             1.4.1
+Version:             2.1.0
 Synopsis:            Simplified logging in IO for application writers.
 License-file:        LICENSE
 License:             MIT
@@ -44,11 +44,11 @@
         base                 >= 3 && < 5
       , binary               >= 0.5.1.1
       , bytestring           >= 0.9.2.1
-      , fast-logger          >= 2.1.5
+      , fast-logger          >= 2.2.0
       , old-locale           >= 1.0.0.5
       , time                 >= 1.4
       , monad-control        >= 0.3.2.3
-      , monad-logger         >= 0.3.4.0
+      , monad-logger         >= 0.3.7.1
       , text                 >= 0.11.3.1
       , transformers         >= 0.3.0.0
       , lifted-base          >= 0.2.2.0
