diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Changelog for rio
 
+## 0.1.12.0
+
+* Add `logFormat` and `setLogFormat` for `LogOptions`.
+
 ## 0.1.11.0
 
 * Replace atomic and durable file writing functions with the ones from `unliftio`, see [#167](https://github.com/commercialhaskell/rio/pull/167)
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -208,7 +208,7 @@
 * `-Wpartial-fields`
 * `-Wredundant-constraints`
 
-You may add them per file, or to your package.yaml, or pass them on
+You may add them per file, or to your `package.yaml`, or pass them on
 the command line when running ghc. We include these in the project
 template's `package.yaml` file.
 
diff --git a/rio.cabal b/rio.cabal
--- a/rio.cabal
+++ b/rio.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 2a45e44bfde95330afa0baab193dbd03b0e1065480a3a90f4d1b5cc5de3a4556
+-- hash: 7dc639bd135a48a7ddeeaf2a43e7de51ccc95f000475f44c042aaa133defb453
 
 name:           rio
-version:        0.1.11.0
+version:        0.1.12.0
 synopsis:       A standard library for Haskell
 description:    See README and Haddocks at <https://www.stackage.org/package/rio>
 category:       Control
diff --git a/src/RIO/Prelude/Logger.hs b/src/RIO/Prelude/Logger.hs
--- a/src/RIO/Prelude/Logger.hs
+++ b/src/RIO/Prelude/Logger.hs
@@ -19,6 +19,7 @@
   , setLogUseTime
   , setLogUseColor
   , setLogUseLoc
+  , setLogFormat
     -- ** Standard logging functions
   , logDebug
   , logInfo
@@ -287,6 +288,7 @@
         , logUseTime = False
         , logUseColor = False
         , logUseLoc = False
+        , logFormat = id
         , logSend = \new -> atomicModifyIORef' ref $ \old -> (old <> new, ())
         }
   return (ref, options)
@@ -324,6 +326,7 @@
     , logUseColor = verbose && terminal
 #endif
     , logUseLoc = verbose
+    , logFormat = id
     , logSend = \builder ->
         if useUtf8 && unicode
           then hPutBuilder handle' (builder <> flush)
@@ -425,6 +428,7 @@
   , logUseTime :: !Bool
   , logUseColor :: !Bool
   , logUseLoc :: !Bool
+  , logFormat :: !(Utf8Builder -> Utf8Builder)
   , logSend :: !(Builder -> IO ())
   }
 
@@ -498,6 +502,14 @@
 setLogUseLoc :: Bool -> LogOptions -> LogOptions
 setLogUseLoc l options = options { logUseLoc = l }
 
+-- | Set format method for messages
+--
+-- Default: `id`
+--
+-- @since 0.1.12.0
+setLogFormat :: (Utf8Builder -> Utf8Builder) -> LogOptions -> LogOptions
+setLogFormat f options = options { logFormat = f }
+
 simpleLogFunc :: LogOptions -> CallStack -> LogSource -> LogLevel -> Utf8Builder -> IO ()
 simpleLogFunc lo cs _src level msg = do
     logLevel   <- logMinLevel lo
@@ -509,7 +521,7 @@
         timestamp <>
         getLevel logVerbose <>
         ansi reset <>
-        msg <>
+        logFormat lo msg <>
         getLoc <>
         ansi reset <>
         "\n"
diff --git a/test/RIO/LoggerSpec.hs b/test/RIO/LoggerSpec.hs
--- a/test/RIO/LoggerSpec.hs
+++ b/test/RIO/LoggerSpec.hs
@@ -67,3 +67,10 @@
       noLogging $ logInfo "should not appear"
     builder <- readIORef ref
     toLazyByteString builder `shouldBe` "[info] should appear\n"
+  it "setLogFormat" $ do
+    (ref, options) <- logOptionsMemory
+    let format = ("[context] " <>)
+    withLogFunc (options & setLogFormat format) $ \lf -> runRIO lf $ do
+      logInfo "should be formatted"
+    builder <- readIORef ref
+    toLazyByteString builder `shouldBe` "[context] should be formatted\n"
