module IHP.Log
( module IHP.Log.Types
, debug
, info
, warn
, error
, fatal
, unknown
, makeRequestLogger
, defaultRequestLogger
) where
import IHP.HaskellSupport hiding (debug)
import CorePrelude hiding (putStr, putStrLn, print, error, show, log, debug)
import Control.Monad (when)
import IHP.Log.Types
import Network.Wai (Middleware)
import Network.Wai.Middleware.RequestLogger (mkRequestLogger, RequestLoggerSettings, destination)
import qualified Network.Wai.Middleware.RequestLogger as RequestLogger
import Data.Default (Default (def))
import qualified System.Log.FastLogger as FastLogger
log :: (?context :: context, LoggingProvider context, FastLogger.ToLogStr string) => LogLevel -> string -> IO ()
log :: LogLevel -> string -> IO ()
log LogLevel
level string
text = do
let logger :: Logger
logger = context -> Logger
forall a. LoggingProvider a => a -> Logger
getLogger context
?context::context
?context
LogLevel -> Logger -> string -> IO ()
forall string.
ToLogStr string =>
LogLevel -> Logger -> string -> IO ()
writeLog LogLevel
level Logger
logger string
text
debug :: (?context :: context, LoggingProvider context, FastLogger.ToLogStr string) => string -> IO ()
debug :: string -> IO ()
debug = LogLevel -> string -> IO ()
forall context string.
(?context::context, LoggingProvider context, ToLogStr string) =>
LogLevel -> string -> IO ()
log LogLevel
Debug
info :: (?context :: context, LoggingProvider context, FastLogger.ToLogStr string) => string -> IO ()
info :: string -> IO ()
info = LogLevel -> string -> IO ()
forall context string.
(?context::context, LoggingProvider context, ToLogStr string) =>
LogLevel -> string -> IO ()
log LogLevel
Info
warn :: (?context :: context, LoggingProvider context, FastLogger.ToLogStr string) => string -> IO ()
warn :: string -> IO ()
warn = LogLevel -> string -> IO ()
forall context string.
(?context::context, LoggingProvider context, ToLogStr string) =>
LogLevel -> string -> IO ()
log LogLevel
Warn
error :: (?context :: context, LoggingProvider context, FastLogger.ToLogStr string) => string -> IO ()
error :: string -> IO ()
error = LogLevel -> string -> IO ()
forall context string.
(?context::context, LoggingProvider context, ToLogStr string) =>
LogLevel -> string -> IO ()
log LogLevel
Error
fatal :: (?context :: context, LoggingProvider context, FastLogger.ToLogStr string) => string -> IO ()
fatal :: string -> IO ()
fatal = LogLevel -> string -> IO ()
forall context string.
(?context::context, LoggingProvider context, ToLogStr string) =>
LogLevel -> string -> IO ()
log LogLevel
Fatal
unknown :: (?context :: context, LoggingProvider context, FastLogger.ToLogStr string) => string -> IO ()
unknown :: string -> IO ()
unknown = LogLevel -> string -> IO ()
forall context string.
(?context::context, LoggingProvider context, ToLogStr string) =>
LogLevel -> string -> IO ()
log LogLevel
Unknown
writeLog :: (FastLogger.ToLogStr string) => LogLevel -> Logger -> string -> IO ()
writeLog :: LogLevel -> Logger -> string -> IO ()
writeLog LogLevel
level Logger
logger string
text = do
let write :: (ByteString -> LogStr) -> IO ()
write = Proxy "write" -> Logger -> (ByteString -> LogStr) -> IO ()
forall model (name :: Symbol) value.
(KnownSymbol name, HasField name model value) =>
Proxy name -> model -> value
get IsLabel "write" (Proxy "write")
Proxy "write"
#write Logger
logger
let formatter :: ByteString -> LogLevel -> LogStr -> LogStr
formatter = Proxy "formatter"
-> Logger -> ByteString -> LogLevel -> LogStr -> LogStr
forall model (name :: Symbol) value.
(KnownSymbol name, HasField name model value) =>
Proxy name -> model -> value
get IsLabel "formatter" (Proxy "formatter")
Proxy "formatter"
#formatter Logger
logger
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (LogLevel
level LogLevel -> LogLevel -> Bool
forall a. Ord a => a -> a -> Bool
>= Proxy "level" -> Logger -> LogLevel
forall model (name :: Symbol) value.
(KnownSymbol name, HasField name model value) =>
Proxy name -> model -> value
get IsLabel "level" (Proxy "level")
Proxy "level"
#level Logger
logger) do
(ByteString -> LogStr) -> IO ()
write (\ByteString
time -> ByteString -> LogLevel -> LogStr -> LogStr
formatter ByteString
time LogLevel
level (string -> LogStr
forall msg. ToLogStr msg => msg -> LogStr
toLogStr string
text))
makeRequestLogger :: RequestLoggerSettings -> Logger -> IO Middleware
makeRequestLogger :: RequestLoggerSettings -> Logger -> IO Middleware
makeRequestLogger RequestLoggerSettings
settings Logger
logger =
RequestLoggerSettings -> IO Middleware
mkRequestLogger RequestLoggerSettings
settings {
destination :: Destination
destination = Callback -> Destination
RequestLogger.Callback (\LogStr
logStr ->
let ?context = logger in
LogStr
logStr LogStr -> (LogStr -> ByteString) -> ByteString
forall t1 t2. t1 -> (t1 -> t2) -> t2
|> LogStr -> ByteString
fromLogStr ByteString -> (ByteString -> IO ()) -> IO ()
forall t1 t2. t1 -> (t1 -> t2) -> t2
|> ByteString -> IO ()
forall context string.
(?context::context, LoggingProvider context, ToLogStr string) =>
string -> IO ()
info
)
}
defaultRequestLogger :: Logger -> IO Middleware
defaultRequestLogger :: Logger -> IO Middleware
defaultRequestLogger = RequestLoggerSettings -> Logger -> IO Middleware
makeRequestLogger RequestLoggerSettings
forall a. Default a => a
def