{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Logging.Global.Internal
( log
, run
) where
import Control.Exception
import Control.Monad
import Control.Monad.IO.Class
import Data.Aeson
import Data.IORef
import Prelude hiding (log)
import System.IO.Unsafe
import Logging.Class
import Logging.Level
import Logging.Logger
import Logging.Manager
import qualified Logging.Monad.Internal as M
{-# NOINLINE ref #-}
ref :: IORef Manager
ref = unsafePerformIO $ newIORef $
error "Global logging manager is not set, see Logging.Global.run"
log :: (MonadIO m, IsMessage s, ToJSON c)
=> Logger -> Level -> s -> c -> (String, String, String, Int) -> m ()
log logger level msg ctx location = liftIO $ do
manager <- readIORef ref
M.runLoggingT (M.log logger level msg ctx location) manager
run :: Manager -> IO a -> IO a
run manager@Manager{..} io = do
bracket_ (initialize manager >> atomicWriteIORef ref manager)
(terminate manager)
(catch io logThrow)
where
unknownLoc = ("unknown file", "unknown package", "unknown module", 0)
logThrow :: SomeException -> IO a
logThrow e | Just UserInterrupt <- fromException e = throw e
logThrow e = log "" "ERROR" e Null unknownLoc >> throw e