{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
module Effectful.Logger.Dynamic
(
Logger (..),
loggerLog,
LogLevel (..),
LogLine,
LogSource,
LogStr,
ToLogStr (..),
fromLogStr,
logTrace,
logDebug,
logInfo,
logWarn,
logError,
logFatal,
logOther,
logTraceSH,
logDebugSH,
logInfoSH,
logWarnSH,
logErrorSH,
logFatalSH,
logOtherSH,
logTraceS,
logDebugS,
logInfoS,
logWarnS,
logErrorS,
logFatalS,
logOtherS,
liftLoc,
logTraceN,
logDebugN,
logInfoN,
logWarnN,
logErrorN,
logFatalN,
logOtherN,
logWithoutLoc,
logTraceNS,
logDebugNS,
logInfoNS,
logWarnNS,
logErrorNS,
logFatalNS,
logOtherNS,
logTraceCS,
logDebugCS,
logInfoCS,
logWarnCS,
logErrorCS,
logFatalCS,
logOtherCS,
defaultLogStr,
Loc (..),
defaultLoc,
defaultOutput,
guardLevel,
shouldLog,
LogFormatter (..),
Utils.defaultLogFormatter,
LocStrategy (..),
formatLog,
_LevelTrace,
_LevelInfo,
_LevelDebug,
_LevelWarn,
_LevelError,
_LevelOther,
_LevelFatal,
)
where
import Control.Monad (when)
import Data.ByteString (ByteString)
import Data.ByteString.Char8 qualified as S8
import Data.Text (Text, pack)
import Data.Text qualified as T
import Effectful
( Dispatch (Dynamic),
DispatchOf,
Eff,
Effect,
type (:>),
)
import Effectful.Concurrent (Concurrent)
import Effectful.Dispatch.Dynamic (HasCallStack, send)
import Effectful.Dynamic.Utils (ShowEffect (showEffectCons))
import Effectful.Logger.Utils
( LocStrategy (LocNone, LocPartial, LocStable),
LogFormatter (MkLogFormatter, locStrategy, newline, threadLabel, timezone),
LogLevel
( LevelDebug,
LevelError,
LevelFatal,
LevelInfo,
LevelOther,
LevelTrace,
LevelWarn
),
)
import Effectful.Logger.Utils qualified as Utils
import Effectful.Time.Dynamic (Time)
import GHC.Stack
( CallStack,
SrcLoc
( srcLocEndCol,
srcLocEndLine,
srcLocFile,
srcLocModule,
srcLocPackage,
srcLocStartCol,
srcLocStartLine
),
getCallStack,
)
import Language.Haskell.TH.Syntax
( Exp,
Lift (lift),
Loc
( Loc,
loc_end,
loc_filename,
loc_module,
loc_package,
loc_start
),
Q,
qLocation,
)
import Optics.Core (Prism')
import Optics.Prism (prism)
import System.IO (Handle)
import System.Log.FastLogger (LogStr, ToLogStr (toLogStr), fromLogStr)
data Logger :: Effect where
LoggerLog ::
(ToLogStr msg) =>
Loc ->
LogSource ->
LogLevel ->
msg ->
Logger m ()
type instance DispatchOf Logger = Dynamic
instance ShowEffect Logger where
showEffectCons :: forall (m :: * -> *) a. Logger m a -> String
showEffectCons = \case
LoggerLog Loc
_ Text
_ LogLevel
_ msg
_ -> String
"LoggerLog"
loggerLog ::
( HasCallStack,
Logger :> es,
ToLogStr msg
) =>
Loc ->
LogSource ->
LogLevel ->
msg ->
Eff es ()
loggerLog :: forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> Eff es ()
loggerLog Loc
loc Text
src LogLevel
lvl = Logger (Eff es) () -> Eff es ()
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Logger (Eff es) () -> Eff es ())
-> (msg -> Logger (Eff es) ()) -> msg -> Eff es ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Loc -> Text -> LogLevel -> msg -> Logger (Eff es) ()
forall msg (m :: * -> *).
ToLogStr msg =>
Loc -> Text -> LogLevel -> msg -> Logger m ()
LoggerLog Loc
loc Text
src LogLevel
lvl
type LogSource = Text
formatLog ::
forall msg es.
( Concurrent :> es,
HasCallStack,
Time :> es,
ToLogStr msg
) =>
LogFormatter ->
LogLevel ->
msg ->
Eff es LogStr
formatLog :: forall msg (es :: [(* -> *) -> * -> *]).
(Concurrent :> es, HasCallStack, Time :> es, ToLogStr msg) =>
LogFormatter -> LogLevel -> msg -> Eff es LogStr
formatLog = Maybe Namespace -> LogFormatter -> LogLevel -> msg -> Eff es LogStr
forall (es :: [(* -> *) -> * -> *]) msg.
(Concurrent :> es, HasCallStack, Time :> es, ToLogStr msg) =>
Maybe Namespace -> LogFormatter -> LogLevel -> msg -> Eff es LogStr
Utils.formatLog Maybe Namespace
forall a. Maybe a
Nothing
logTH :: LogLevel -> Q Exp
logTH :: LogLevel -> Q Exp
logTH LogLevel
level =
[|
loggerLog $(Q Loc
forall (m :: * -> *). Quasi m => m Loc
qLocation Q Loc -> (Loc -> Q Exp) -> Q Exp
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Loc -> Q Exp
liftLoc) (pack "") $(LogLevel -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => LogLevel -> m Exp
lift LogLevel
level)
. (id :: Text -> Text)
|]
logTHShow :: LogLevel -> Q Exp
logTHShow :: LogLevel -> Q Exp
logTHShow LogLevel
level =
[|
loggerLog $(Q Loc
forall (m :: * -> *). Quasi m => m Loc
qLocation Q Loc -> (Loc -> Q Exp) -> Q Exp
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Loc -> Q Exp
liftLoc) (pack "") $(LogLevel -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => LogLevel -> m Exp
lift LogLevel
level)
. ((pack . show) :: (Show a) => a -> Text)
|]
logTrace :: Q Exp
logTrace :: Q Exp
logTrace = LogLevel -> Q Exp
logTH LogLevel
LevelTrace
logDebug :: Q Exp
logDebug :: Q Exp
logDebug = LogLevel -> Q Exp
logTH LogLevel
LevelDebug
logInfo :: Q Exp
logInfo :: Q Exp
logInfo = LogLevel -> Q Exp
logTH LogLevel
LevelInfo
logWarn :: Q Exp
logWarn :: Q Exp
logWarn = LogLevel -> Q Exp
logTH LogLevel
LevelWarn
logError :: Q Exp
logError :: Q Exp
logError = LogLevel -> Q Exp
logTH LogLevel
LevelError
logFatal :: Q Exp
logFatal :: Q Exp
logFatal = LogLevel -> Q Exp
logTH LogLevel
LevelFatal
logOther :: Text -> Q Exp
logOther :: Text -> Q Exp
logOther = LogLevel -> Q Exp
logTH (LogLevel -> Q Exp) -> (Text -> LogLevel) -> Text -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> LogLevel
LevelOther
logTraceSH :: Q Exp
logTraceSH :: Q Exp
logTraceSH = LogLevel -> Q Exp
logTHShow LogLevel
LevelTrace
logDebugSH :: Q Exp
logDebugSH :: Q Exp
logDebugSH = LogLevel -> Q Exp
logTHShow LogLevel
LevelDebug
logInfoSH :: Q Exp
logInfoSH :: Q Exp
logInfoSH = LogLevel -> Q Exp
logTHShow LogLevel
LevelInfo
logWarnSH :: Q Exp
logWarnSH :: Q Exp
logWarnSH = LogLevel -> Q Exp
logTHShow LogLevel
LevelWarn
logErrorSH :: Q Exp
logErrorSH :: Q Exp
logErrorSH = LogLevel -> Q Exp
logTHShow LogLevel
LevelError
logFatalSH :: Q Exp
logFatalSH :: Q Exp
logFatalSH = LogLevel -> Q Exp
logTHShow LogLevel
LevelFatal
logOtherSH :: Text -> Q Exp
logOtherSH :: Text -> Q Exp
logOtherSH = LogLevel -> Q Exp
logTHShow (LogLevel -> Q Exp) -> (Text -> LogLevel) -> Text -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> LogLevel
LevelOther
liftLoc :: Loc -> Q Exp
liftLoc :: Loc -> Q Exp
liftLoc (Loc String
a String
b String
c (Int
d1, Int
d2) (Int
e1, Int
e2)) =
[|
Loc
$(String -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => String -> m Exp
lift String
a)
$(String -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => String -> m Exp
lift String
b)
$(String -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => String -> m Exp
lift String
c)
($(Int -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => Int -> m Exp
lift Int
d1), $(Int -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => Int -> m Exp
lift Int
d2))
($(Int -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => Int -> m Exp
lift Int
e1), $(Int -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => Int -> m Exp
lift Int
e2))
|]
logTraceS :: Q Exp
logTraceS :: Q Exp
logTraceS =
[|\a b -> loggerLog $(Q Loc
forall (m :: * -> *). Quasi m => m Loc
qLocation Q Loc -> (Loc -> Q Exp) -> Q Exp
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Loc -> Q Exp
liftLoc) a LevelTrace (b :: Text)|]
logDebugS :: Q Exp
logDebugS :: Q Exp
logDebugS =
[|\a b -> loggerLog $(Q Loc
forall (m :: * -> *). Quasi m => m Loc
qLocation Q Loc -> (Loc -> Q Exp) -> Q Exp
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Loc -> Q Exp
liftLoc) a LevelDebug (b :: Text)|]
logInfoS :: Q Exp
logInfoS :: Q Exp
logInfoS =
[|\a b -> loggerLog $(Q Loc
forall (m :: * -> *). Quasi m => m Loc
qLocation Q Loc -> (Loc -> Q Exp) -> Q Exp
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Loc -> Q Exp
liftLoc) a LevelInfo (b :: Text)|]
logWarnS :: Q Exp
logWarnS :: Q Exp
logWarnS =
[|\a b -> loggerLog $(Q Loc
forall (m :: * -> *). Quasi m => m Loc
qLocation Q Loc -> (Loc -> Q Exp) -> Q Exp
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Loc -> Q Exp
liftLoc) a LevelWarn (b :: Text)|]
logErrorS :: Q Exp
logErrorS :: Q Exp
logErrorS =
[|\a b -> loggerLog $(Q Loc
forall (m :: * -> *). Quasi m => m Loc
qLocation Q Loc -> (Loc -> Q Exp) -> Q Exp
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Loc -> Q Exp
liftLoc) a LevelError (b :: Text)|]
logFatalS :: Q Exp
logFatalS :: Q Exp
logFatalS =
[|\a b -> loggerLog $(Q Loc
forall (m :: * -> *). Quasi m => m Loc
qLocation Q Loc -> (Loc -> Q Exp) -> Q Exp
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Loc -> Q Exp
liftLoc) a LevelFatal (b :: Text)|]
logOtherS :: Q Exp
logOtherS :: Q Exp
logOtherS =
[|
\src level msg ->
loggerLog
$(Q Loc
forall (m :: * -> *). Quasi m => m Loc
qLocation Q Loc -> (Loc -> Q Exp) -> Q Exp
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Loc -> Q Exp
liftLoc)
src
(LevelOther level)
(msg :: Text)
|]
type LogLine = (Loc, LogSource, LogLevel, LogStr)
defaultOutput ::
(HasCallStack) =>
Handle ->
Loc ->
LogSource ->
LogLevel ->
LogStr ->
IO ()
defaultOutput :: HasCallStack =>
Handle -> Loc -> Text -> LogLevel -> LogStr -> IO ()
defaultOutput Handle
h Loc
loc Text
src LogLevel
level LogStr
msg =
Handle -> ByteString -> IO ()
S8.hPutStr Handle
h ByteString
ls
where
ls :: ByteString
ls = Loc -> Text -> LogLevel -> LogStr -> ByteString
defaultLogStrBS Loc
loc Text
src LogLevel
level LogStr
msg
defaultLogStrBS ::
Loc ->
LogSource ->
LogLevel ->
LogStr ->
ByteString
defaultLogStrBS :: Loc -> Text -> LogLevel -> LogStr -> ByteString
defaultLogStrBS Loc
a Text
b LogLevel
c LogStr
d = LogStr -> ByteString
fromLogStr (LogStr -> ByteString) -> LogStr -> ByteString
forall a b. (a -> b) -> a -> b
$ Loc -> Text -> LogLevel -> LogStr -> LogStr
defaultLogStr Loc
a Text
b LogLevel
c LogStr
d
defaultLogLevelStr :: LogLevel -> LogStr
defaultLogLevelStr :: LogLevel -> LogStr
defaultLogLevelStr LogLevel
level = case LogLevel
level of
LevelOther Text
t -> Text -> LogStr
forall msg. ToLogStr msg => msg -> LogStr
toLogStr Text
t
LogLevel
_ -> ByteString -> LogStr
forall msg. ToLogStr msg => msg -> LogStr
toLogStr (ByteString -> LogStr) -> ByteString -> LogStr
forall a b. (a -> b) -> a -> b
$ String -> ByteString
S8.pack (String -> ByteString) -> String -> ByteString
forall a b. (a -> b) -> a -> b
$ Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
5 (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ LogLevel -> String
forall a. Show a => a -> String
show LogLevel
level
defaultLogStr ::
Loc ->
LogSource ->
LogLevel ->
LogStr ->
LogStr
defaultLogStr :: Loc -> Text -> LogLevel -> LogStr -> LogStr
defaultLogStr Loc
loc Text
src LogLevel
level LogStr
msg =
LogStr
"["
LogStr -> LogStr -> LogStr
forall a. Semigroup a => a -> a -> a
<> LogLevel -> LogStr
defaultLogLevelStr LogLevel
level
LogStr -> LogStr -> LogStr
forall a. Semigroup a => a -> a -> a
<> ( if Text -> Bool
T.null Text
src
then LogStr
forall a. Monoid a => a
mempty
else LogStr
"#" LogStr -> LogStr -> LogStr
forall a. Semigroup a => a -> a -> a
<> Text -> LogStr
forall msg. ToLogStr msg => msg -> LogStr
toLogStr Text
src
)
LogStr -> LogStr -> LogStr
forall a. Semigroup a => a -> a -> a
<> LogStr
"] "
LogStr -> LogStr -> LogStr
forall a. Semigroup a => a -> a -> a
<> LogStr
msg
LogStr -> LogStr -> LogStr
forall a. Semigroup a => a -> a -> a
<> ( if Loc -> Bool
isDefaultLoc Loc
loc
then LogStr
"\n"
else
LogStr
" @("
LogStr -> LogStr -> LogStr
forall a. Semigroup a => a -> a -> a
<> ByteString -> LogStr
forall msg. ToLogStr msg => msg -> LogStr
toLogStr (String -> ByteString
S8.pack String
fileLocStr)
LogStr -> LogStr -> LogStr
forall a. Semigroup a => a -> a -> a
<> LogStr
")\n"
)
where
fileLocStr :: String
fileLocStr =
Loc -> String
loc_package Loc
loc
String -> String -> String
forall a. [a] -> [a] -> [a]
++ Char
':'
Char -> String -> String
forall a. a -> [a] -> [a]
: Loc -> String
loc_module Loc
loc
String -> String -> String
forall a. [a] -> [a] -> [a]
++ Char
' '
Char -> String -> String
forall a. a -> [a] -> [a]
: Loc -> String
loc_filename Loc
loc
String -> String -> String
forall a. [a] -> [a] -> [a]
++ Char
':'
Char -> String -> String
forall a. a -> [a] -> [a]
: Loc -> String
line Loc
loc
String -> String -> String
forall a. [a] -> [a] -> [a]
++ Char
':'
Char -> String -> String
forall a. a -> [a] -> [a]
: Loc -> String
char Loc
loc
where
line :: Loc -> String
line = Int -> String
forall a. Show a => a -> String
show (Int -> String) -> (Loc -> Int) -> Loc -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int, Int) -> Int
forall a b. (a, b) -> a
fst ((Int, Int) -> Int) -> (Loc -> (Int, Int)) -> Loc -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Loc -> (Int, Int)
loc_start
char :: Loc -> String
char = Int -> String
forall a. Show a => a -> String
show (Int -> String) -> (Loc -> Int) -> Loc -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int, Int) -> Int
forall a b. (a, b) -> b
snd ((Int, Int) -> Int) -> (Loc -> (Int, Int)) -> Loc -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Loc -> (Int, Int)
loc_start
defaultLoc :: Loc
defaultLoc :: Loc
defaultLoc = String -> String -> String -> (Int, Int) -> (Int, Int) -> Loc
Loc String
"<unknown>" String
"<unknown>" String
"<unknown>" (Int
0, Int
0) (Int
0, Int
0)
isDefaultLoc :: Loc -> Bool
isDefaultLoc :: Loc -> Bool
isDefaultLoc (Loc String
"<unknown>" String
"<unknown>" String
"<unknown>" (Int
0, Int
0) (Int
0, Int
0)) = Bool
True
isDefaultLoc Loc
_ = Bool
False
logWithoutLoc ::
( HasCallStack,
Logger :> es,
ToLogStr msg
) =>
LogSource ->
LogLevel ->
msg ->
Eff es ()
logWithoutLoc :: forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc = Loc -> Text -> LogLevel -> msg -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> Eff es ()
loggerLog Loc
defaultLoc
logTraceN :: (Logger :> es) => Text -> Eff es ()
logTraceN :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Eff es ()
logTraceN = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
"" LogLevel
LevelTrace
logDebugN :: (Logger :> es) => Text -> Eff es ()
logDebugN :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Eff es ()
logDebugN = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
"" LogLevel
LevelDebug
logInfoN :: (Logger :> es) => Text -> Eff es ()
logInfoN :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Eff es ()
logInfoN = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
"" LogLevel
LevelInfo
logWarnN :: (Logger :> es) => Text -> Eff es ()
logWarnN :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Eff es ()
logWarnN = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
"" LogLevel
LevelWarn
logErrorN :: (Logger :> es) => Text -> Eff es ()
logErrorN :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Eff es ()
logErrorN = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
"" LogLevel
LevelError
logFatalN :: (Logger :> es) => Text -> Eff es ()
logFatalN :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Eff es ()
logFatalN = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
"" LogLevel
LevelFatal
logOtherN :: (Logger :> es) => LogLevel -> Text -> Eff es ()
logOtherN :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
LogLevel -> Text -> Eff es ()
logOtherN = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
""
logTraceNS :: (Logger :> es) => LogSource -> Text -> Eff es ()
logTraceNS :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Text -> Eff es ()
logTraceNS Text
src = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
src LogLevel
LevelTrace
logDebugNS :: (Logger :> es) => LogSource -> Text -> Eff es ()
logDebugNS :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Text -> Eff es ()
logDebugNS Text
src = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
src LogLevel
LevelDebug
logInfoNS :: (Logger :> es) => LogSource -> Text -> Eff es ()
logInfoNS :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Text -> Eff es ()
logInfoNS Text
src = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
src LogLevel
LevelInfo
logWarnNS :: (Logger :> es) => LogSource -> Text -> Eff es ()
logWarnNS :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Text -> Eff es ()
logWarnNS Text
src = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
src LogLevel
LevelWarn
logErrorNS :: (Logger :> es) => LogSource -> Text -> Eff es ()
logErrorNS :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Text -> Eff es ()
logErrorNS Text
src = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
src LogLevel
LevelError
logFatalNS :: (Logger :> es) => LogSource -> Text -> Eff es ()
logFatalNS :: forall (es :: [(* -> *) -> * -> *]).
(Logger :> es) =>
Text -> Text -> Eff es ()
logFatalNS Text
src = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc Text
src LogLevel
LevelFatal
logOtherNS ::
(HasCallStack, Logger :> es) =>
LogSource ->
LogLevel ->
Text ->
Eff es ()
logOtherNS :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Logger :> es) =>
Text -> LogLevel -> Text -> Eff es ()
logOtherNS = Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Text -> LogLevel -> msg -> Eff es ()
logWithoutLoc
mkLoggerLoc :: SrcLoc -> Loc
mkLoggerLoc :: SrcLoc -> Loc
mkLoggerLoc SrcLoc
loc =
Loc
{ loc_filename :: String
loc_filename = SrcLoc -> String
srcLocFile SrcLoc
loc,
loc_package :: String
loc_package = SrcLoc -> String
srcLocPackage SrcLoc
loc,
loc_module :: String
loc_module = SrcLoc -> String
srcLocModule SrcLoc
loc,
loc_start :: (Int, Int)
loc_start =
( SrcLoc -> Int
srcLocStartLine SrcLoc
loc,
SrcLoc -> Int
srcLocStartCol SrcLoc
loc
),
loc_end :: (Int, Int)
loc_end =
( SrcLoc -> Int
srcLocEndLine SrcLoc
loc,
SrcLoc -> Int
srcLocEndCol SrcLoc
loc
)
}
locFromCS :: CallStack -> Loc
locFromCS :: CallStack -> Loc
locFromCS CallStack
cs = case CallStack -> [(String, SrcLoc)]
getCallStack CallStack
cs of
((String
_, SrcLoc
loc) : [(String, SrcLoc)]
_) -> SrcLoc -> Loc
mkLoggerLoc SrcLoc
loc
[(String, SrcLoc)]
_ -> Loc
defaultLoc
logCS ::
(HasCallStack, Logger :> es, ToLogStr msg) =>
CallStack ->
LogSource ->
LogLevel ->
msg ->
Eff es ()
logCS :: forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
CallStack -> Text -> LogLevel -> msg -> Eff es ()
logCS CallStack
cs = Loc -> Text -> LogLevel -> msg -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> Eff es ()
loggerLog (CallStack -> Loc
locFromCS CallStack
cs)
logTraceCS :: (HasCallStack, Logger :> es) => CallStack -> Text -> Eff es ()
logTraceCS :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Logger :> es) =>
CallStack -> Text -> Eff es ()
logTraceCS CallStack
cs = CallStack -> Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
CallStack -> Text -> LogLevel -> msg -> Eff es ()
logCS CallStack
cs Text
"" LogLevel
LevelTrace
logDebugCS :: (HasCallStack, Logger :> es) => CallStack -> Text -> Eff es ()
logDebugCS :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Logger :> es) =>
CallStack -> Text -> Eff es ()
logDebugCS CallStack
cs = CallStack -> Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
CallStack -> Text -> LogLevel -> msg -> Eff es ()
logCS CallStack
cs Text
"" LogLevel
LevelDebug
logInfoCS :: (HasCallStack, Logger :> es) => CallStack -> Text -> Eff es ()
logInfoCS :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Logger :> es) =>
CallStack -> Text -> Eff es ()
logInfoCS CallStack
cs = CallStack -> Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
CallStack -> Text -> LogLevel -> msg -> Eff es ()
logCS CallStack
cs Text
"" LogLevel
LevelInfo
logWarnCS :: (HasCallStack, Logger :> es) => CallStack -> Text -> Eff es ()
logWarnCS :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Logger :> es) =>
CallStack -> Text -> Eff es ()
logWarnCS CallStack
cs = CallStack -> Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
CallStack -> Text -> LogLevel -> msg -> Eff es ()
logCS CallStack
cs Text
"" LogLevel
LevelWarn
logErrorCS :: (HasCallStack, Logger :> es) => CallStack -> Text -> Eff es ()
logErrorCS :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Logger :> es) =>
CallStack -> Text -> Eff es ()
logErrorCS CallStack
cs = CallStack -> Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
CallStack -> Text -> LogLevel -> msg -> Eff es ()
logCS CallStack
cs Text
"" LogLevel
LevelError
logFatalCS :: (HasCallStack, Logger :> es) => CallStack -> Text -> Eff es ()
logFatalCS :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Logger :> es) =>
CallStack -> Text -> Eff es ()
logFatalCS CallStack
cs = CallStack -> Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
CallStack -> Text -> LogLevel -> msg -> Eff es ()
logCS CallStack
cs Text
"" LogLevel
LevelFatal
logOtherCS ::
(HasCallStack, Logger :> es) =>
CallStack ->
LogLevel ->
Text ->
Eff es ()
logOtherCS :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Logger :> es) =>
CallStack -> LogLevel -> Text -> Eff es ()
logOtherCS CallStack
cs = CallStack -> Text -> LogLevel -> Text -> Eff es ()
forall (es :: [(* -> *) -> * -> *]) msg.
(HasCallStack, Logger :> es, ToLogStr msg) =>
CallStack -> Text -> LogLevel -> msg -> Eff es ()
logCS CallStack
cs Text
""
guardLevel ::
(Applicative f, HasCallStack) =>
LogLevel ->
LogLevel ->
((HasCallStack) => f ()) ->
f ()
guardLevel :: forall (f :: * -> *).
(Applicative f, HasCallStack) =>
LogLevel -> LogLevel -> (HasCallStack => f ()) -> f ()
guardLevel LogLevel
configLvl LogLevel
lvl HasCallStack => f ()
logAction =
Bool -> f () -> f ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (LogLevel -> LogLevel -> Bool
shouldLog LogLevel
configLvl LogLevel
lvl) f ()
HasCallStack => f ()
logAction
shouldLog ::
LogLevel ->
LogLevel ->
Bool
shouldLog :: LogLevel -> LogLevel -> Bool
shouldLog = LogLevel -> LogLevel -> Bool
forall a. Ord a => a -> a -> Bool
(<=)
_LevelTrace :: Prism' LogLevel ()
_LevelTrace :: Prism' LogLevel ()
_LevelTrace =
(() -> LogLevel)
-> (LogLevel -> Either LogLevel ()) -> Prism' LogLevel ()
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
(LogLevel -> () -> LogLevel
forall a b. a -> b -> a
const LogLevel
LevelTrace)
( \case
LogLevel
LevelTrace -> () -> Either LogLevel ()
forall a b. b -> Either a b
Right ()
LogLevel
other -> LogLevel -> Either LogLevel ()
forall a b. a -> Either a b
Left LogLevel
other
)
{-# INLINE _LevelTrace #-}
_LevelDebug :: Prism' LogLevel ()
_LevelDebug :: Prism' LogLevel ()
_LevelDebug =
(() -> LogLevel)
-> (LogLevel -> Either LogLevel ()) -> Prism' LogLevel ()
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
(LogLevel -> () -> LogLevel
forall a b. a -> b -> a
const LogLevel
LevelDebug)
( \case
LogLevel
LevelDebug -> () -> Either LogLevel ()
forall a b. b -> Either a b
Right ()
LogLevel
other -> LogLevel -> Either LogLevel ()
forall a b. a -> Either a b
Left LogLevel
other
)
{-# INLINE _LevelDebug #-}
_LevelInfo :: Prism' LogLevel ()
_LevelInfo :: Prism' LogLevel ()
_LevelInfo =
(() -> LogLevel)
-> (LogLevel -> Either LogLevel ()) -> Prism' LogLevel ()
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
(LogLevel -> () -> LogLevel
forall a b. a -> b -> a
const LogLevel
LevelInfo)
( \case
LogLevel
LevelInfo -> () -> Either LogLevel ()
forall a b. b -> Either a b
Right ()
LogLevel
other -> LogLevel -> Either LogLevel ()
forall a b. a -> Either a b
Left LogLevel
other
)
{-# INLINE _LevelInfo #-}
_LevelWarn :: Prism' LogLevel ()
_LevelWarn :: Prism' LogLevel ()
_LevelWarn =
(() -> LogLevel)
-> (LogLevel -> Either LogLevel ()) -> Prism' LogLevel ()
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
(LogLevel -> () -> LogLevel
forall a b. a -> b -> a
const LogLevel
LevelWarn)
( \case
LogLevel
LevelWarn -> () -> Either LogLevel ()
forall a b. b -> Either a b
Right ()
LogLevel
other -> LogLevel -> Either LogLevel ()
forall a b. a -> Either a b
Left LogLevel
other
)
{-# INLINE _LevelWarn #-}
_LevelError :: Prism' LogLevel ()
_LevelError :: Prism' LogLevel ()
_LevelError =
(() -> LogLevel)
-> (LogLevel -> Either LogLevel ()) -> Prism' LogLevel ()
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
(LogLevel -> () -> LogLevel
forall a b. a -> b -> a
const LogLevel
LevelError)
( \case
LogLevel
LevelError -> () -> Either LogLevel ()
forall a b. b -> Either a b
Right ()
LogLevel
other -> LogLevel -> Either LogLevel ()
forall a b. a -> Either a b
Left LogLevel
other
)
{-# INLINE _LevelError #-}
_LevelOther :: Prism' LogLevel Text
_LevelOther :: Prism' LogLevel Text
_LevelOther =
(Text -> LogLevel)
-> (LogLevel -> Either LogLevel Text) -> Prism' LogLevel Text
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
Text -> LogLevel
LevelOther
( \case
LevelOther Text
l -> Text -> Either LogLevel Text
forall a b. b -> Either a b
Right Text
l
LogLevel
other -> LogLevel -> Either LogLevel Text
forall a b. a -> Either a b
Left LogLevel
other
)
{-# INLINE _LevelOther #-}
_LevelFatal :: Prism' LogLevel ()
_LevelFatal :: Prism' LogLevel ()
_LevelFatal =
(() -> LogLevel)
-> (LogLevel -> Either LogLevel ()) -> Prism' LogLevel ()
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
(LogLevel -> () -> LogLevel
forall a b. a -> b -> a
const LogLevel
LevelFatal)
( \case
LogLevel
LevelFatal -> () -> Either LogLevel ()
forall a b. b -> Either a b
Right ()
LogLevel
other -> LogLevel -> Either LogLevel ()
forall a b. a -> Either a b
Left LogLevel
other
)
{-# INLINE _LevelFatal #-}