{- | Module : Neovim.Log Description : Logging utilities and reexports Copyright : (c) Sebastian Witte License : Apache-2.0 Maintainer : woozletoff@gmail.com Stability : experimental Portability : GHC -} module Neovim.Log ( disableLogger, withLogger, module System.Log.Logger, ) where import Control.Exception import System.Log.Formatter (simpleLogFormatter) import System.Log.Handler (setFormatter) import System.Log.Handler.Simple import System.Log.Logger -- | Disable logging to stderr. disableLogger :: IO a -> IO a disableLogger action = do updateGlobalLogger rootLoggerName removeHandler action -- | Initialize the root logger to avoid stderr and set it to log the given -- file instead. Simply wrap the main entry point with this function to -- initialze the logger. -- -- @ -- main = 'withLogger' "\/home\/dude\/nvim.log" 'Debug' \$ do -- 'putStrLn' "Hello, World!" -- @ withLogger :: FilePath -> Priority -> IO a -> IO a withLogger fp p action = bracket setupRootLogger (\fh -> closeFunc fh (privData fh)) (const action) where setupRootLogger = do -- We shouldn't log to stderr or stdout as it is not unlikely that our -- messagepack communication is handled via those channels. disableLogger (return ()) -- Log to the given file instead fh <- fileHandler fp p -- Adjust logging format let fh' = setFormatter fh (simpleLogFormatter "[$loggername : $prio] $msg") -- Adjust the log level as well updateGlobalLogger rootLoggerName (setLevel p . addHandler fh') -- For good measure, log some debug information logM "Neovim.Debug" DEBUG $ unwords ["Initialized root looger with priority", show p, "and file: ", fp] return fh'