wobsurv-0.1.0: library/Wobsurv/Logging.hs
module Wobsurv.Logging where
import BasePrelude hiding (log)
import qualified Wobsurv.Interaction
import qualified System.Locale as Locale
import qualified Data.Time as Time
import qualified Wobsurv.Util.HTTP.Renderer as HTTP.Renderer
import qualified Wobsurv.Util.HTTP.Model as HTTP.Model
import qualified Wobsurv.Util.HTTP.URLEncoding as HTTP.URLEncoding
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.Builder as ByteString.Builder
import qualified Data.ByteString.Lazy.Char8 as ByteString.Lazy.Char8
import qualified Data.Text.Lazy.IO as Text.Lazy.IO
import qualified Data.Text.Lazy.Encoding as Text.Lazy.Encoding
import qualified Data.Text.Lazy.Builder as Text.Lazy.Builder
log :: Wobsurv.Interaction.Summary -> IO ()
log (request, status) =
Text.Lazy.IO.putStrLn =<< do
time <- Time.formatTime Locale.defaultTimeLocale "%F %X %Z" <$> Time.getZonedTime
return $ Text.Lazy.Builder.toLazyText $
case request of
Just (method, uri) ->
Text.Lazy.Builder.fromString time <>
Text.Lazy.Builder.fromString ": " <>
(liftBSB $ HTTP.Renderer.status status) <>
Text.Lazy.Builder.fromString " <-- " <>
(liftBSB $ HTTP.Renderer.method method) <>
Text.Lazy.Builder.singleton ' ' <>
(Text.Lazy.Builder.fromText $ HTTP.URLEncoding.toText $ HTTP.Renderer.toByteString $ HTTP.Renderer.relativeURI uri)
Nothing ->
Text.Lazy.Builder.fromString time <>
Text.Lazy.Builder.fromString ": " <>
(liftBSB $ HTTP.Renderer.status status)
where
liftBSB =
Text.Lazy.Builder.fromLazyText . Text.Lazy.Encoding.decodeLatin1 . ByteString.Builder.toLazyByteString
newSynchronizedLogger :: IO (Wobsurv.Interaction.Summary -> IO ())
newSynchronizedLogger = do
loggerLock <- newMVar ()
return $
\m -> withMVar loggerLock $ const $ log m