diff --git a/lib/Polysemy/Log/Di.hs b/lib/Polysemy/Log/Di.hs
--- a/lib/Polysemy/Log/Di.hs
+++ b/lib/Polysemy/Log/Di.hs
@@ -6,13 +6,14 @@
   -- * Interpreters
   interpretLogDi,
   interpretLogDi',
+  interpretLogDiConc,
   interpretDataLogDi,
   interpretDiAtomic,
   interpretDiAtomic'
 ) where
 
-import Polysemy.Log.Di.Di (interpretLogDi, interpretLogDi', interpretDataLogDi)
-import Polysemy.Log.Di.Atomic (interpretDiAtomic', interpretDiAtomic)
+import Polysemy.Log.Di.Atomic (interpretDiAtomic, interpretDiAtomic')
+import Polysemy.Log.Di.Di (interpretDataLogDi, interpretLogDi, interpretLogDi', interpretLogDiConc)
 -- $intro
 -- This package is a [di](https://hackage.haskell.org/package/di-polysemy) adapter for
 -- [polysemy-log](https://hackage.haskell.org/package/polysemy-log), providing interpreters that convert
diff --git a/lib/Polysemy/Log/Di/Di.hs b/lib/Polysemy/Log/Di/Di.hs
--- a/lib/Polysemy/Log/Di/Di.hs
+++ b/lib/Polysemy/Log/Di/Di.hs
@@ -2,28 +2,47 @@
 module Polysemy.Log.Di.Di where
 
 import qualified DiPolysemy as Di
+import Polysemy (interpretH, runT)
+import Polysemy.Async (Async)
 import Polysemy.Internal (InterpretersFor, raise2Under)
+import Polysemy.Internal.Tactics (liftT)
+import Polysemy.Resource (Resource)
 import Polysemy.Time (GhcTime)
 
-import Polysemy.Log.Data.DataLog (DataLog(DataLog))
+import Polysemy.Log.Data.DataLog (DataLog(DataLog, Local))
 import Polysemy.Log.Data.Log (Log)
 import qualified Polysemy.Log.Data.LogEntry as LogEntry
 import Polysemy.Log.Data.LogEntry (LogEntry)
 import qualified Polysemy.Log.Data.LogMessage as LogMessage
 import Polysemy.Log.Data.LogMessage (LogMessage)
 import Polysemy.Log.Data.Severity (Severity)
-import Polysemy.Log.Log (interpretLogDataLog, interpretLogDataLog')
+import Polysemy.Log.Log (interpretLogDataLog, interpretLogDataLog', interpretLogDataLogConc)
 
 -- |Reinterpret 'DataLog' as 'Di.Di', using the provided function to extract the log level from the message.
+-- Maintains a context function as state that is applied to each logged message, allowing the context of a block to be
+-- modified.
+interpretDataLogDiLocal ::
+  ∀ level path msg r .
+  Member (Di.Di level path msg) r =>
+  (msg -> level) ->
+  (msg -> msg) ->
+  InterpreterFor (DataLog msg) r
+interpretDataLogDiLocal extractLevel context =
+  interpretH \case
+    DataLog msg ->
+      liftT (Di.log @_ @path (extractLevel msg) (context msg))
+    Local f ma ->
+      raise . interpretDataLogDiLocal @_ @path extractLevel (f . context) =<< runT ma
+{-# INLINE interpretDataLogDiLocal #-}
+
+-- |Reinterpret 'DataLog' as 'Di.Di', using the provided function to extract the log level from the message.
 interpretDataLogDi ::
   ∀ level path msg r .
   Member (Di.Di level path msg) r =>
   (msg -> level) ->
   InterpreterFor (DataLog msg) r
 interpretDataLogDi extractLevel =
-  interpret \case
-    DataLog msg ->
-      Di.log @_ @path (extractLevel msg) msg
+  interpretDataLogDiLocal @_ @path extractLevel id
 {-# INLINE interpretDataLogDi #-}
 
 -- |Reinterpret 'Log' as 'Di.Di', using the /polysemy-log/ default message.
@@ -51,3 +70,15 @@
   raiseUnder .
   raise2Under
 {-# INLINE interpretLogDi' #-}
+
+-- |Reinterpret 'Log' as 'Di.Di' concurrently.
+interpretLogDiConc ::
+  ∀ path r .
+  Members [Di.Di Severity path (LogEntry LogMessage), Resource, Async, Embed IO] r =>
+  Int ->
+  InterpreterFor Log r
+interpretLogDiConc maxQueued =
+  interpretDataLogDi @_ @path (LogMessage.severity . LogEntry.message) .
+  interpretLogDataLogConc maxQueued .
+  raiseUnder
+{-# INLINE interpretLogDiConc #-}
diff --git a/polysemy-log-di.cabal b/polysemy-log-di.cabal
--- a/polysemy-log-di.cabal
+++ b/polysemy-log-di.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           polysemy-log-di
-version:        0.1.0.0
+version:        0.2.0.0
 synopsis:       polysemy-log interpreter for di
 description:    See <https://hackage.haskell.org/package/polysemy-log-di/docs/Polysemy-Log-Di.html>
 category:       Logging
