-- Copyright: 2009 Dino Morelli
-- License: BSD3 (see LICENSE)
-- Author: Dino Morelli <dino@ui3.info>

module Cargs.Log
   ( logMsg, initLogging, setLoggingVerbose, setLoggingQuiet )
   where

import Control.Monad ( liftM )
import System.IO ( stdout )
import System.Locale ( defaultTimeLocale )
import System.Log.Handler.Simple ( streamHandler )
import System.Log.Logger ( Priority (..), noticeM
   , rootLoggerName, updateGlobalLogger, setHandlers, setLevel )
import System.Time ( formatCalendarTime
   , getClockTime, toCalendarTime )
import Text.Printf ( printf )


{- Format the time right now as needed for logging
-}
date :: IO String
date = liftM
   ( formatCalendarTime defaultTimeLocale "%Y-%m-%d %H:%M:%S" )
   $ getClockTime >>= toCalendarTime


{- Print a timestamped log message
-}
logMsg :: String -> IO ()
logMsg msg = do
   d <- date
   noticeM loggerCargs $ printf "%s> %s" d msg


-- Logger identifier, used below
loggerCargs :: String
loggerCargs = "cargs"


{- Default hslogger behavior sends logging to stderr. In this case,
   we want it to go to stdout.
-}
initLogging :: IO ()
initLogging = do
   sol <- streamHandler stdout DEBUG
   updateGlobalLogger rootLoggerName (setHandlers [sol])
   setLoggingQuiet


{- Shortcut for setting what we consider "verbose" logging:
   NOTICE (or below)
-}
setLoggingVerbose :: IO ()
setLoggingVerbose = updateGlobalLogger loggerCargs $ setLevel NOTICE


{- Shortcut for setting what we consider "quiet":
   WARNING (or above)
-}
setLoggingQuiet :: IO ()
setLoggingQuiet = updateGlobalLogger loggerCargs $ setLevel WARNING

