{- | 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'