diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# log-effectful-1.0.2.0 (2026-08-11)
+* Add `runNoLog`, a handler that discards all log messages without requiring
+  `IOE` in the effect stack.
+
 # log-effectful-1.0.1.0 (2024-11-07)
 * Convert `Log` into a dynamically dispatched effect.
 
diff --git a/log-effectful.cabal b/log-effectful.cabal
--- a/log-effectful.cabal
+++ b/log-effectful.cabal
@@ -1,7 +1,7 @@
 cabal-version:      3.0
 build-type:         Simple
 name:               log-effectful
-version:            1.0.1.0
+version:            1.0.2.0
 license:            BSD-3-Clause
 license-file:       LICENSE
 category:           System
@@ -16,7 +16,7 @@
   CHANGELOG.md
   README.md
 
-tested-with: GHC == { 8.10.7, 9.0.2, 9.2.8, 9.4.8, 9.6.6, 9.8.2, 9.10.1 }
+tested-with: GHC == { 8.10.7, 9.0.2, 9.2.8, 9.4.8, 9.6.7, 9.8.4, 9.10.3, 9.12.4, 9.14.1 }
 
 bug-reports: https://github.com/haskell-effectful/log-effectful/issues
 source-repository head
@@ -70,11 +70,9 @@
   ghc-options:     -threaded -rtsopts
 
   build-depends:     base
-                   , aeson
                    , effectful-core
                    , log-base
                    , log-effectful
-                   , text
 
   hs-source-dirs: tests
 
diff --git a/src/Effectful/Log.hs b/src/Effectful/Log.hs
--- a/src/Effectful/Log.hs
+++ b/src/Effectful/Log.hs
@@ -7,6 +7,7 @@
 
     -- ** Handlers
   , runLog
+  , runNoLog
 
     -- * Re-exports
   , module Log
@@ -33,6 +34,10 @@
 -- | Run the 'Log' effect.
 --
 -- /Note:/ this is the @effectful@ version of 'runLogT'.
+--
+-- /Note:/ logging can be skipped by passing 'mempty' as the 'Logger', which
+-- discards all messages while still requiring 'IOE'. Use 'runNoLog' instead
+-- if 'IOE' is not otherwise present in the type signature.
 runLog
   :: IOE :> es
   => Text
@@ -63,6 +68,30 @@
       , leDomain = []
       , leData = []
       , leMaxLogLevel = maxLogLevel
+      }
+
+-- | Run the 'Log' effect by discarding all messages.
+--
+-- This is useful for skipping the 'Log' effect when it is present in the
+-- type signature but no actual logging back-end is available, e.g. when
+-- running pure code with 'runPureEff'.
+runNoLog :: Eff (Log : es) a -> Eff es a
+runNoLog = reinterpret reader $ \env -> \case
+  LogMessageOp {} -> pure ()
+  LocalData data_ action -> localSeqUnlift env $ \unlift -> do
+    (`local` unlift action) $ \logEnv -> logEnv { leData = data_ ++ leData logEnv }
+  LocalDomain domain action -> localSeqUnlift env $ \unlift -> do
+    (`local` unlift action) $ \logEnv -> logEnv { leDomain = leDomain logEnv ++ [domain] }
+  LocalMaxLogLevel level action -> localSeqUnlift env $ \unlift -> do
+    (`local` unlift action) $ \logEnv -> logEnv { leMaxLogLevel = level }
+  GetLoggerEnv -> ask
+  where
+    reader = runReader LoggerEnv
+      { leLogger = mempty
+      , leComponent = mempty
+      , leDomain = []
+      , leData = []
+      , leMaxLogLevel = defaultLogLevel
       }
 
 -- | Orphan, canonical instance.
