diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 2.1.4
+
+* Add log support to persistent-sqlite [#381](https://github.com/yesodweb/persistent/pull/381)
+
 ## 2.1.3
 
 * Added a `Show` instance for `SqliteConf`.
diff --git a/Database/Sqlite.hs b/Database/Sqlite.hs
--- a/Database/Sqlite.hs
+++ b/Database/Sqlite.hs
@@ -10,6 +10,8 @@
                          SqliteException(..),
                          StepResult(Row,
                                     Done),
+                         Config(ConfigLogFn),
+                         LogFunction,
                          open,
                          close,
                          prepare,
@@ -25,7 +27,10 @@
                          bind,
                          column,
                          columns,
-                         changes
+                         changes,
+                         mkLogFunction,
+                         freeLogFunction,
+                         config
                         )
     where
 
@@ -473,3 +478,53 @@
 
 changes :: Connection -> IO Int64
 changes (Connection _ c) = fmap fromIntegral $ changesC c
+
+-- | Log function callback. Arguments are error code and log message.
+--
+-- Since 2.1.4
+type RawLogFunction = Ptr () -> Int -> CString -> IO ()
+
+foreign import ccall "wrapper"
+  mkRawLogFunction :: RawLogFunction -> IO (FunPtr RawLogFunction)
+
+-- |
+-- Since 2.1.4
+newtype LogFunction = LogFunction (FunPtr RawLogFunction)
+
+-- | Wraps a given function to a 'LogFunction' to be further used with 'ConfigLogFn'.
+-- First argument of given function will take error code, second - log message.
+-- Returned value should be released with 'freeLogFunction' when no longer required.
+mkLogFunction :: (Int -> String -> IO ()) -> IO LogFunction
+mkLogFunction fn = fmap LogFunction . mkRawLogFunction $ \_ errCode cmsg -> do
+  msg <- peekCString cmsg
+  fn errCode msg
+
+-- | Releases a native FunPtr for the 'LogFunction'.
+--
+-- Since 2.1.4
+freeLogFunction :: LogFunction -> IO ()
+freeLogFunction (LogFunction fn) = freeHaskellFunPtr fn
+
+-- | Configuration option for SQLite to be used together with the 'config' function.
+--
+-- Since 2.1.4
+data Config
+  -- | A function to be used for logging
+  = ConfigLogFn LogFunction
+
+foreign import ccall "persistent_sqlite_set_log"
+  set_logC :: FunPtr RawLogFunction -> Ptr () -> IO Int
+
+-- | Sets SQLite global configuration parameter. See SQLite documentation for the <https://www.sqlite.org/c3ref/config.html sqlite3_config> function.
+-- In short, this must be called prior to any other SQLite function if you want the call to succeed.
+--
+-- Since 2.1.4
+config :: Config -> IO ()
+config c = case c of
+  ConfigLogFn (LogFunction rawLogFn) -> do
+    e <- fmap decodeError $ set_logC rawLogFn nullPtr
+    case e of
+      ErrorOK -> return ()
+      _ -> sqlError Nothing "sqlite3_config" e
+
+
diff --git a/cbits/config.c b/cbits/config.c
new file mode 100644
--- /dev/null
+++ b/cbits/config.c
@@ -0,0 +1,6 @@
+/* This file defines auxiliary functions to help dealing with sqlite vararg stuff. */
+#include <sqlite3.h>
+
+int persistent_sqlite_set_log(void (*logFn)(void*, int, const char*), void* arg) {
+  return sqlite3_config(SQLITE_CONFIG_LOG, logFn, arg);
+}
diff --git a/persistent-sqlite.cabal b/persistent-sqlite.cabal
--- a/persistent-sqlite.cabal
+++ b/persistent-sqlite.cabal
@@ -1,5 +1,5 @@
 name:            persistent-sqlite
-version:         2.1.3
+version:         2.1.4
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -42,7 +42,10 @@
         extra-libraries: sqlite3
     else
         c-sources:   cbits/sqlite3.c
+        include-dirs: cbits
         cc-options:  -fPIC
+
+    c-sources: cbits/config.c
 
     if !os(windows)
         extra-libraries: pthread
