module Amazonka.Logger
(
Logger,
newLogger,
LogLevel (..),
logError,
logInfo,
logDebug,
logTrace,
ToLog (..),
buildLines,
)
where
import Amazonka.Data
import Amazonka.Prelude
import qualified Control.Monad as Monad
import qualified Data.ByteString.Builder as Build
import qualified System.IO as IO
type Logger = LogLevel -> ByteStringBuilder -> IO ()
newLogger :: MonadIO m => LogLevel -> IO.Handle -> m Logger
newLogger :: forall (m :: * -> *). MonadIO m => LogLevel -> Handle -> m Logger
newLogger LogLevel
x Handle
hd =
IO Logger -> m Logger
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Logger -> m Logger) -> IO Logger -> m Logger
forall a b. (a -> b) -> a -> b
$ do
Handle -> BufferMode -> IO ()
IO.hSetBuffering Handle
hd BufferMode
IO.LineBuffering
Logger -> IO Logger
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Logger -> IO Logger) -> Logger -> IO Logger
forall a b. (a -> b) -> a -> b
$ \LogLevel
y Builder
b ->
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.when (LogLevel
x LogLevel -> LogLevel -> Bool
forall a. Ord a => a -> a -> Bool
>= LogLevel
y) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
Handle -> Builder -> IO ()
Build.hPutBuilder Handle
hd (Builder
b Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"\n")
data LogLevel
=
Info
|
Error
|
Debug
|
Trace
deriving stock (LogLevel -> LogLevel -> Bool
(LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> Bool) -> Eq LogLevel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LogLevel -> LogLevel -> Bool
== :: LogLevel -> LogLevel -> Bool
$c/= :: LogLevel -> LogLevel -> Bool
/= :: LogLevel -> LogLevel -> Bool
Eq, Eq LogLevel
Eq LogLevel =>
(LogLevel -> LogLevel -> Ordering)
-> (LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> Bool)
-> (LogLevel -> LogLevel -> LogLevel)
-> (LogLevel -> LogLevel -> LogLevel)
-> Ord LogLevel
LogLevel -> LogLevel -> Bool
LogLevel -> LogLevel -> Ordering
LogLevel -> LogLevel -> LogLevel
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: LogLevel -> LogLevel -> Ordering
compare :: LogLevel -> LogLevel -> Ordering
$c< :: LogLevel -> LogLevel -> Bool
< :: LogLevel -> LogLevel -> Bool
$c<= :: LogLevel -> LogLevel -> Bool
<= :: LogLevel -> LogLevel -> Bool
$c> :: LogLevel -> LogLevel -> Bool
> :: LogLevel -> LogLevel -> Bool
$c>= :: LogLevel -> LogLevel -> Bool
>= :: LogLevel -> LogLevel -> Bool
$cmax :: LogLevel -> LogLevel -> LogLevel
max :: LogLevel -> LogLevel -> LogLevel
$cmin :: LogLevel -> LogLevel -> LogLevel
min :: LogLevel -> LogLevel -> LogLevel
Ord, Int -> LogLevel
LogLevel -> Int
LogLevel -> [LogLevel]
LogLevel -> LogLevel
LogLevel -> LogLevel -> [LogLevel]
LogLevel -> LogLevel -> LogLevel -> [LogLevel]
(LogLevel -> LogLevel)
-> (LogLevel -> LogLevel)
-> (Int -> LogLevel)
-> (LogLevel -> Int)
-> (LogLevel -> [LogLevel])
-> (LogLevel -> LogLevel -> [LogLevel])
-> (LogLevel -> LogLevel -> [LogLevel])
-> (LogLevel -> LogLevel -> LogLevel -> [LogLevel])
-> Enum LogLevel
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: LogLevel -> LogLevel
succ :: LogLevel -> LogLevel
$cpred :: LogLevel -> LogLevel
pred :: LogLevel -> LogLevel
$ctoEnum :: Int -> LogLevel
toEnum :: Int -> LogLevel
$cfromEnum :: LogLevel -> Int
fromEnum :: LogLevel -> Int
$cenumFrom :: LogLevel -> [LogLevel]
enumFrom :: LogLevel -> [LogLevel]
$cenumFromThen :: LogLevel -> LogLevel -> [LogLevel]
enumFromThen :: LogLevel -> LogLevel -> [LogLevel]
$cenumFromTo :: LogLevel -> LogLevel -> [LogLevel]
enumFromTo :: LogLevel -> LogLevel -> [LogLevel]
$cenumFromThenTo :: LogLevel -> LogLevel -> LogLevel -> [LogLevel]
enumFromThenTo :: LogLevel -> LogLevel -> LogLevel -> [LogLevel]
Enum, Int -> LogLevel -> ShowS
[LogLevel] -> ShowS
LogLevel -> [Char]
(Int -> LogLevel -> ShowS)
-> (LogLevel -> [Char]) -> ([LogLevel] -> ShowS) -> Show LogLevel
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LogLevel -> ShowS
showsPrec :: Int -> LogLevel -> ShowS
$cshow :: LogLevel -> [Char]
show :: LogLevel -> [Char]
$cshowList :: [LogLevel] -> ShowS
showList :: [LogLevel] -> ShowS
Show, (forall x. LogLevel -> Rep LogLevel x)
-> (forall x. Rep LogLevel x -> LogLevel) -> Generic LogLevel
forall x. Rep LogLevel x -> LogLevel
forall x. LogLevel -> Rep LogLevel x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. LogLevel -> Rep LogLevel x
from :: forall x. LogLevel -> Rep LogLevel x
$cto :: forall x. Rep LogLevel x -> LogLevel
to :: forall x. Rep LogLevel x -> LogLevel
Generic)
instance FromText LogLevel where
fromText :: Text -> Either [Char] LogLevel
fromText = \case
Text
"info" -> LogLevel -> Either [Char] LogLevel
forall a. a -> Either [Char] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LogLevel
Info
Text
"error" -> LogLevel -> Either [Char] LogLevel
forall a. a -> Either [Char] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LogLevel
Error
Text
"debug" -> LogLevel -> Either [Char] LogLevel
forall a. a -> Either [Char] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LogLevel
Debug
Text
"trace" -> LogLevel -> Either [Char] LogLevel
forall a. a -> Either [Char] a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LogLevel
Trace
Text
other -> [Char] -> Either [Char] LogLevel
forall a b. a -> Either a b
Left ([Char]
"Failure parsing LogLevel from " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
forall a. Show a => a -> [Char]
show Text
other)
instance ToText LogLevel where
toText :: LogLevel -> Text
toText = \case
LogLevel
Info -> Text
"info"
LogLevel
Error -> Text
"error"
LogLevel
Debug -> Text
"debug"
LogLevel
Trace -> Text
"trace"
instance ToByteString LogLevel
logError, logInfo, logDebug, logTrace :: (MonadIO m, ToLog a) => Logger -> a -> m ()
logError :: forall (m :: * -> *) a. (MonadIO m, ToLog a) => Logger -> a -> m ()
logError Logger
f = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (a -> IO ()) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Logger
f LogLevel
Error (Builder -> IO ()) -> (a -> Builder) -> a -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Builder
forall a. ToLog a => a -> Builder
build
logInfo :: forall (m :: * -> *) a. (MonadIO m, ToLog a) => Logger -> a -> m ()
logInfo Logger
f = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (a -> IO ()) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Logger
f LogLevel
Info (Builder -> IO ()) -> (a -> Builder) -> a -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Builder
forall a. ToLog a => a -> Builder
build
logDebug :: forall (m :: * -> *) a. (MonadIO m, ToLog a) => Logger -> a -> m ()
logDebug Logger
f = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (a -> IO ()) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Logger
f LogLevel
Debug (Builder -> IO ()) -> (a -> Builder) -> a -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Builder
forall a. ToLog a => a -> Builder
build
logTrace :: forall (m :: * -> *) a. (MonadIO m, ToLog a) => Logger -> a -> m ()
logTrace Logger
f = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (a -> IO ()) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Logger
f LogLevel
Trace (Builder -> IO ()) -> (a -> Builder) -> a -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Builder
forall a. ToLog a => a -> Builder
build