{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} {-| Module : Control.Monad.Logger.JSON Description : Easy functions for logging ToJSON instances Copyright : (c) FPComplete, 2015 License : MIT Maintainer : FP Complete Developers Stability : experimental Portability : POSIX Template Haskell logging functions to compliment Control.Monad.Logger. These functions handle encoding ToJSON types to the log. Example: ``` import Control.Monad.IO.Class ( MonadIO(liftIO) ) import Control.Monad.Logger ( runStdoutLoggingT ) import Control.Monad.Logger.JSON ( logInfoJ, logDebugJ ) import Data.Aeson.TH ( defaultOptions, deriveJSON ) import Data.Time.Clock ( UTCTime, getCurrentTime ) data Message = Message { time :: UTCTime } $( deriveJSON defaultOptions ''Message ) main :: IO () main = runStdoutLoggingT (do now <- liftIO getCurrentTime $logDebugJ (Message now) $logInfoJ "Hello world") ``` |-} module Control.Monad.Logger.JSON (logDebugJ, logInfoJ, logWarnJ, logErrorJ, logOtherJ) where import Control.Monad.Logger ( LogLevel(..), liftLoc, monadLoggerLog ) import Data.Aeson ( encode ) import Data.Text ( Text, pack ) import Language.Haskell.TH ( Exp, Q ) import Language.Haskell.TH.Syntax ( lift, qLocation ) logJSON :: LogLevel -> Q Exp logJSON level = [|monadLoggerLog $(qLocation >>= liftLoc) (pack "") $(lift level) . encode|] logDebugJ :: Q Exp logDebugJ = logJSON LevelDebug logInfoJ :: Q Exp logInfoJ = logJSON LevelInfo logWarnJ :: Q Exp logWarnJ = logJSON LevelWarn logErrorJ :: Q Exp logErrorJ = logJSON LevelError logOtherJ :: Text -> Q Exp logOtherJ = logJSON . LevelOther