module Photoname.Log
  ( initLogging
  , lname
  , logTest

  -- Re-exported from System.Log
  , debugM, infoM, noticeM, warningM, errorM, criticalM, alertM, emergencyM
  )
  where

import System.IO ( Handle, stdout )
import System.Log.Handler.Simple ( GenericHandler, streamHandler )
import System.Log.Logger

import Photoname.Common ( Verbosity (Quiet, Verbose) )


lname :: String
lname :: String
lname = String
rootLoggerName


initLogging :: Verbosity -> IO ()
initLogging :: Verbosity -> IO ()
initLogging Verbosity
verbosity = do
  String -> (Logger -> Logger) -> IO ()
updateGlobalLogger String
lname ((Logger -> Logger) -> IO ())
-> ([GenericHandler Handle] -> Logger -> Logger)
-> [GenericHandler Handle]
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
setHandlers ([GenericHandler Handle] -> IO ())
-> IO [GenericHandler Handle] -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Verbosity -> IO [GenericHandler Handle]
handlers Verbosity
verbosity
  case Verbosity
verbosity of
    Verbosity
Quiet -> () -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    Verbose Priority
loggerLevel -> String -> (Logger -> Logger) -> IO ()
updateGlobalLogger String
lname ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ Priority -> Logger -> Logger
setLevel Priority
loggerLevel


handlers :: Verbosity -> IO [GenericHandler Handle]
handlers :: Verbosity -> IO [GenericHandler Handle]
handlers Verbosity
Quiet  = [GenericHandler Handle] -> IO [GenericHandler Handle]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
handlers (Verbose Priority
_) = [IO (GenericHandler Handle)] -> IO [GenericHandler Handle]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [Handle -> Priority -> IO (GenericHandler Handle)
streamHandler Handle
stdout Priority
DEBUG]


-- Test function to generate every kind of log message
logTest :: IO ()
logTest :: IO ()
logTest = do
  String -> String -> IO ()
debugM     String
lname String
"log test message DEBUG 1 of 8"
  String -> String -> IO ()
infoM      String
lname String
"log test message INFO 2 of 8"
  String -> String -> IO ()
noticeM    String
lname String
"log test message NOTICE 3 of 8"
  String -> String -> IO ()
warningM   String
lname String
"log test message WARNING 4 of 8"
  String -> String -> IO ()
errorM     String
lname String
"log test message ERROR 5 of 8"
  String -> String -> IO ()
criticalM  String
lname String
"log test message CRITICAL 6 of 8"
  String -> String -> IO ()
alertM     String
lname String
"log test message ALERT 7 of 8"
  String -> String -> IO ()
emergencyM String
lname String
"log test message EMERGENCY 8 of 8"