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