packages feed

hprox-0.7.0: src/Network/HProx/Log.hs

-- SPDX-License-Identifier: Apache-2.0
--
-- Copyright (C) 2026 Bin Jin. All Rights Reserved.

module Network.HProx.Log
  ( LogLevel(..)
  , LogOutput(..)
  , LogStr
  , LogType'(..)
  , Logger
  , ToLogStr(..)
  , logLevelReader
  , logOutputType
  , parseLogOutput
  , withLogger
  ) where

import System.Log.FastLogger

-- | Logging level, default value is INFO
data LogLevel = TRACE
              | DEBUG
              | INFO
              | WARN
              | ERROR
              | NONE
  deriving (Show, Eq, Ord)

logLevelReader :: String -> Maybe LogLevel
logLevelReader "trace" = Just TRACE
logLevelReader "debug" = Just DEBUG
logLevelReader "info"  = Just INFO
logLevelReader "warn"  = Just WARN
logLevelReader "error" = Just ERROR
logLevelReader "none"  = Just NONE
logLevelReader _       = Nothing

data LogOutput = LogOutputNone
               | LogOutputStdout
               | LogOutputStderr
               | LogOutputFile !FilePath
  deriving (Show, Eq)

parseLogOutput :: String -> LogOutput
parseLogOutput "none"   = LogOutputNone
parseLogOutput "stdout" = LogOutputStdout
parseLogOutput "stderr" = LogOutputStderr
parseLogOutput file     = LogOutputFile file

logOutputType :: LogOutput -> LogType' LogStr
logOutputType LogOutputNone        = LogNone
logOutputType LogOutputStdout      = LogStdout 4096
logOutputType LogOutputStderr      = LogStderr 4096
logOutputType (LogOutputFile file) = LogFileNoRotate file 4096

logWith :: TimedFastLogger -> LogLevel -> LogStr -> IO ()
logWith logger level logstr = logger (\time -> toLogStr time <> " [" <> toLogStr (show level) <> "] " <> logstr <> "\n")

type Logger = LogLevel -> LogStr -> IO ()
withLogger :: LogType -> LogLevel -> ((LogLevel -> LogStr -> IO ()) -> IO ()) -> IO ()
withLogger logType logLevel toRun = do
    timeCache <- newTimeCache "%Y/%m/%d %T %Z"
    withTimedFastLogger timeCache logType $ \timedLogger ->
        let logger level str
                | level < logLevel = return ()
                | otherwise        = logWith timedLogger level str
        in toRun logger