packages feed

batchd-core-0.1.0.0: src/Batchd/Core/Daemon/Logging.hs

{-# LANGUAGE TemplateHaskell, TypeFamilies, OverloadedStrings #-}
-- | This module contains utilities for logging, used by batchd daemon.
-- This also reexports required modules from @heavy-logger@ package.
module Batchd.Core.Daemon.Logging
  (
    translateString,
    logIO, debugIO, infoIO, reportErrorIO,
    -- * Reexports
    module System.Log.Heavy.Types,
    module System.Log.Heavy.Level,
    module System.Log.Heavy.Util,
    module System.Log.Heavy.TH,
    module System.Log.Heavy.Backends
  ) where

import Control.Monad (when)
import qualified Control.Monad.Trans as Trans
import Control.Monad.Trans (MonadIO)
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Format.Heavy as F
import Language.Haskell.TH hiding (reportError)
import System.Log.Heavy
import System.Log.Heavy.Types
import System.Log.Heavy.Level
import System.Log.Heavy.Util
import System.Log.Heavy.TH
import System.Log.Heavy.Backends
import Text.Localize (translate, Localized)

import Batchd.Core.Common.Types

-- | Variant of @translate@, which takes String argument.
translateString :: Localized m => String -> m TL.Text
translateString str = translate $ stringToBstr str

-- | Write a message to log within IO monad.
logIO :: (F.ClosedVarContainer vars, MonadIO m) => LoggingTState -> Loc -> Level -> TL.Text -> vars -> m ()
logIO lts loc level msg vars = Trans.liftIO $
  do
    let src = splitDots (loc_module loc)
    let message = LogMessage level src loc msg vars []
    when (checkContextFilter (ltsContext lts) message) $ do
        ltsLogger lts message

-- | Write a debug message to log within IO monad.
debugIO :: (F.ClosedVarContainer vars, MonadIO m)
        => LoggingTState                     -- ^ Logging state
        -> Loc                               -- ^ Message location in Haskell source. Usually filled by @\$(here)@ TH macros.
        -> TL.Text                           -- ^ Message string, with placeholders if needed.
        -> vars                              -- ^ Message variables. Use @()@ if you do not have variables.
        -> m ()
debugIO lts loc = logIO lts loc debug_level

-- | Write an info message to log within IO monad.
infoIO :: (F.ClosedVarContainer vars, MonadIO m)
       => LoggingTState -- ^ Logging state
       -> Loc           -- ^ Message location in Haskell source. Usually filled by @\$(here)@ TH macros.
       -> TL.Text       -- ^ Message string, with placeholders if needed.
       -> vars          -- ^ Message variables. Use @()@ if you do not have variables.                   
       -> m ()
infoIO lts loc = logIO lts loc info_level

-- | Write an error message to log within IO monad.
reportErrorIO :: (F.ClosedVarContainer vars, MonadIO m)
              => LoggingTState -- ^ Logging state
              -> Loc           -- ^ Message location in Haskell source. Usually filled by @\$(here)@ TH macros.
              -> TL.Text       -- ^ Message string, with placeholders if needed.
              -> vars          -- ^ Message variables. Use @()@ if you do not have variables.                   
              -> m ()
reportErrorIO lts loc = logIO lts loc error_level