packages feed

nvim-hs-2.3.2.1: src/Neovim/Log.hs

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