packages feed

cacophony-0.6.0: examples/echo-server/Log.hs

{-# LANGUAGE OverloadedStrings #-}
module Log where

import Control.Exception     (SomeException, displayException)
import Data.Aeson            (encode, object, (.=))
import Data.ByteString       (ByteString)
import Data.ByteString.Char8 (unpack)
import Data.Monoid           ((<>))
import Data.UnixTime         (formatUnixTime, fromEpochTime)
import Network.Socket        (SockAddr)
import System.Log.FastLogger (toLogStr, pushLogStr, LoggerSet, newFileLoggerSet,
                              newStdoutLoggerSet)
import System.Posix          (epochTime)
import System.Posix.Files    (setFileCreationMask)

openLog :: FilePath -> IO LoggerSet
openLog file = do
  _ <- setFileCreationMask 0o000
  newFileLoggerSet 1024 file

openStdOut :: IO LoggerSet
openStdOut = newStdoutLoggerSet 0

logMsg :: LoggerSet
       -> IO ByteString
       -> SockAddr
       -> ByteString
       -> IO ()
logMsg ls getCachedDate ip msg = do
  zdt <- getCachedDate
  (pushLogStr ls . toLogStr) . (<> "\n") . encode $
    object [ "date"    .= unpack zdt
           , "message" .= unpack msg
           , "ip"      .= show ip
           ]

logException :: LoggerSet
             -> IO ByteString
             -> SockAddr
             -> SomeException
             -> IO ()
logException ls getCachedDate ip ex = do
  zdt <- getCachedDate
  (pushLogStr ls . toLogStr) . (<> "\n") . encode $
    object [ "date"      .= unpack zdt
           , "exception" .= displayException ex
           , "ip"        .= show ip
           ]

getDateTime :: IO ByteString
getDateTime = epochTime >>= formatUnixTime "%Y-%m-%d %H:%M:%S %z" . fromEpochTime