diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+0.5.1.0
+=======
+* Add mkFileScribe, a specialization of mkHandleScribe for files that manages the handle automatically.
+
 0.5.0.4
 =======
 * Loosen Win32 upper bound to run with GHC 8.2 on Windows.
diff --git a/katip.cabal b/katip.cabal
--- a/katip.cabal
+++ b/katip.cabal
@@ -1,5 +1,5 @@
 name:                katip
-version:             0.5.0.4
+version:             0.5.1.0
 synopsis:            A structured logging framework.
 description:
   Katip is a structured logging framework. See README.md for more details.
diff --git a/src/Katip.hs b/src/Katip.hs
--- a/src/Katip.hs
+++ b/src/Katip.hs
@@ -177,6 +177,7 @@
 
     -- * Included Scribes
     , mkHandleScribe
+    , mkFileScribe
     , ColorStrategy (..)
 
     -- * Tools for implementing Scribes
diff --git a/src/Katip/Scribes/Handle.hs b/src/Katip/Scribes/Handle.hs
--- a/src/Katip/Scribes/Handle.hs
+++ b/src/Katip/Scribes/Handle.hs
@@ -5,7 +5,7 @@
 -------------------------------------------------------------------------------
 import           Control.Applicative    as A
 import           Control.Concurrent
-import           Control.Exception      (bracket_)
+import           Control.Exception      (bracket_, finally)
 import           Control.Monad
 import           Data.Aeson
 import qualified Data.HashMap.Strict    as HM
@@ -61,7 +61,8 @@
 -- > [2016-05-11 21:01:15][MyApp.confrabulation][Debug][myhost.example.com][1724][ThreadId 1154][confrab_factor:42.0][main:Helpers.Logging Helpers/Logging.hs:41:9] Confrabulating widgets, with extra namespace and context
 -- > [2016-05-11 21:01:15][MyApp][Info][myhost.example.com][1724][ThreadId 1154][main:Helpers.Logging Helpers/Logging.hs:43:7] Namespace and context are back to normal
 --
--- Returns the newly-created `Scribe`. The finalizer flushes the handle.
+-- Returns the newly-created `Scribe`. The finalizer flushes the
+-- handle. Handle mode is set to 'LineBuffering' automatically.
 mkHandleScribe :: ColorStrategy -> Handle -> Severity -> Verbosity -> IO Scribe
 mkHandleScribe cs h sev verb = do
     hSetBuffering h LineBuffering
@@ -73,6 +74,19 @@
           when (permitItem sev i) $ bracket_ (takeMVar lock) (putMVar lock ()) $
             T.hPutStrLn h $ toLazyText $ formatItem colorize verb i
     return $ Scribe logger (hFlush h)
+
+
+-------------------------------------------------------------------------------
+-- | A specialization of 'mkHandleScribe' that takes a 'FilePath'
+-- instead of a 'Handle'. It is responsible for opening the file in
+-- 'AppendMode' and will close the file handle on
+-- 'closeScribe'/'closeScribes'. Does not do log coloring. Sets handle
+-- to 'LineBuffering' mode.
+mkFileScribe :: FilePath -> Severity -> Verbosity -> IO Scribe
+mkFileScribe f sev verb = do
+  h <- openFile f AppendMode
+  Scribe logger finalizer <- mkHandleScribe (ColorLog False) h sev verb
+  return (Scribe logger (finalizer `finally` hClose h))
 
 
 -------------------------------------------------------------------------------
diff --git a/test/Katip/Tests/Scribes/Handle.hs b/test/Katip/Tests/Scribes/Handle.hs
--- a/test/Katip/Tests/Scribes/Handle.hs
+++ b/test/Katip/Tests/Scribes/Handle.hs
@@ -42,10 +42,19 @@
        let pat = "\\[[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2} [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}\\]\\[katip-test.test\\]\\[Info\\]\\[.+\\]\\[[[:digit:]]+\\]\\[ThreadId [[:digit:]]+\\]\\[note.deep:some note\\] test message" :: String
        let matches = res =~ pat
        assertBool (show res <> " did not match") matches
+  , withResource setupFile (const (return ())) $ \setupScribe -> testCase "logs correct data to a file" $ do
+      (path, fin, le) <- setupScribe
+      runKatipT le $ logItem dummyLogItem "test" Nothing InfoS "test message"
+      fin
+      runKatipT le $ logItem dummyLogItem "test" Nothing InfoS "wont make it in"
+      res <- readFile path
+      let pat = "\\[[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2} [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}\\]\\[katip-test.test\\]\\[Info\\]\\[.+\\]\\[[[:digit:]]+\\]\\[ThreadId [[:digit:]]+\\]\\[note.deep:some note\\] test message" :: String
+      let matches = res =~ pat
+      assertBool (show res <> " did not match") matches
   , withResource setupTempFile teardownTempFile $ \setupFn ->
-       goldenVsString "Text-golden"
-                      "test/Katip/Tests/Scribes/Handle-text.golden"
-                      (setupFn >>= writeTextLog)
+      goldenVsString "Text-golden"
+                     "test/Katip/Tests/Scribes/Handle-text.golden"
+                     (setupFn >>= writeTextLog)
   ]
 
 
@@ -86,11 +95,22 @@
 
 
 -------------------------------------------------------------------------------
-teardown :: (FilePath, Handle, IO (), LogEnv) -> IO ()
+teardown :: (a, Handle, b, c) -> IO ()
 teardown (_, h, _, _) = do
   chk <- hIsOpen h
   when chk $ hClose h
 
+
+-------------------------------------------------------------------------------
+setupFile :: IO (FilePath, IO (), LogEnv)
+setupFile = do
+  tempDir <- getTemporaryDirectory
+  (fp, h) <- openTempFile tempDir "katip.log"
+  hClose h
+  s <- mkFileScribe fp DebugS V3
+  le <- initLogEnv "katip-test" "test"
+  le' <- registerScribe "handle" s defaultScribeSettings le
+  return (fp, void (closeScribes le'), le')
 
 
 -- Following code tests Handle scribe output against a golden file.
