module Haskell.Debug.Adapter.Logger where

import Haskell.Debug.Adapter.Constant

import System.IO
import qualified System.Log.Logger as L
import qualified System.Log.Formatter as L
import qualified System.Log.Handler as LH
import qualified System.Log.Handler.Simple as LHS


-- |
--  setup logger
-- 
setUpLogger :: FilePath -> L.Priority -> IO ()
setUpLogger :: FilePath -> Priority -> IO ()
setUpLogger FilePath
path Priority
lv = do

  IO ()
L.removeAllHandlers
  
  Handle
logStream <- FilePath -> IOMode -> IO Handle
openFile FilePath
path IOMode
AppendMode
  Handle -> TextEncoding -> IO ()
hSetEncoding Handle
logStream TextEncoding
utf8
  Handle -> BufferMode -> IO ()
hSetBuffering Handle
logStream BufferMode
NoBuffering

  GenericHandler Handle
logH <- Handle -> Priority -> IO (GenericHandler Handle)
LHS.streamHandler Handle
logStream Priority
lv

  let logHandle :: GenericHandler Handle
logHandle  = GenericHandler Handle
logH {closeFunc :: Handle -> IO ()
LHS.closeFunc = Handle -> IO ()
hClose}
      logFormat :: LogFormatter a
logFormat  = FilePath -> FilePath -> LogFormatter a
forall a. FilePath -> FilePath -> LogFormatter a
L.tfLogFormatter FilePath
_LOG_FORMAT_DATE FilePath
_LOG_FORMAT
      logHandler :: GenericHandler Handle
logHandler = GenericHandler Handle
-> LogFormatter (GenericHandler Handle) -> GenericHandler Handle
forall a. LogHandler a => a -> LogFormatter a -> a
LH.setFormatter GenericHandler Handle
logHandle LogFormatter (GenericHandler Handle)
forall a. LogFormatter a
logFormat

  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
L.rootLoggerName ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
L.setHandlers ([] :: [LHS.GenericHandler Handle])

  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_NAME ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
L.setHandlers [GenericHandler Handle
logHandler]
  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_NAME ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ Priority -> Logger -> Logger
L.setLevel Priority
lv

  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_REQUEST ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
L.setHandlers [GenericHandler Handle
logHandler]
  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_REQUEST ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ Priority -> Logger -> Logger
L.setLevel Priority
lv

  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_RESPONSE ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
L.setHandlers [GenericHandler Handle
logHandler]
  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_RESPONSE ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ Priority -> Logger -> Logger
L.setLevel Priority
lv

  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_APP ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
L.setHandlers [GenericHandler Handle
logHandler]
  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_APP ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ Priority -> Logger -> Logger
L.setLevel Priority
lv

  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_THREAD_MGR ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
L.setHandlers [GenericHandler Handle
logHandler]
  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_THREAD_MGR ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ Priority -> Logger -> Logger
L.setLevel Priority
lv

  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_EVENT ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
L.setHandlers [GenericHandler Handle
logHandler]
  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_EVENT ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ Priority -> Logger -> Logger
L.setLevel Priority
lv

  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_GHCI_STDOUT ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
L.setHandlers [GenericHandler Handle
logHandler]
  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_GHCI_STDOUT ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ Priority -> Logger -> Logger
L.setLevel Priority
lv

  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_WATCH ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
L.setHandlers [GenericHandler Handle
logHandler]
  FilePath -> (Logger -> Logger) -> IO ()
L.updateGlobalLogger FilePath
_LOG_WATCH ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ Priority -> Logger -> Logger
L.setLevel Priority
lv