{-# LANGUAGE OverloadedStrings #-} module NgxExport.Log.Base (LogLevel (..), logG, logM, logR) where import NgxExport import NgxExport.Tools import NgxExport.Log.CLog import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as C8 import qualified Data.ByteString.Unsafe as B import Foreign.Ptr import Control.Arrow import Data.Char -- | Log severity levels. -- -- Being applied to a certain constructor, function 'fromEnum' returns the value -- of the corresponding macro definition from /ngx_log.h/. data LogLevel = LogStderr | LogEmerg | LogAlert | LogCrit | LogErr | LogWarn | LogNotice | LogInfo | LogDebug deriving Enum -- | Logs a message to the global Nginx log. logG :: LogLevel -- ^ Log severity level -> ByteString -- ^ Log message -> IO () logG _ "" = return () logG l msg = do c <- ngxCyclePtr B.unsafeUseAsCStringLen msg $ \(x, i) -> c_log c (fromIntegral $ fromEnum l) x $ fromIntegral i -- | Logs a message to the request's Nginx log. -- -- This function accepts a pointer to the Nginx request object supposedly -- unmarshalled from Nginx variable /$_r_ptr/. logM :: LogLevel -- ^ Log severity level -> Ptr () -- ^ Pointer to the Nginx request object -> ByteString -- ^ Log message -> IO () logM l r msg = B.unsafeUseAsCStringLen msg $ \(x, i) -> c_log_r r (fromIntegral $ fromEnum l) x $ fromIntegral i -- | Logs a message to the request's Nginx log. -- -- This function expects that the log message contains the value of Nginx -- variable /$_r_ptr/ at the beginning of the log message. All whitespace -- characters following the value of /$_r_ptr/ are skipped. logR :: LogLevel -- ^ Log severity level -> ByteString -- ^ Log message -> IO () logR _ "" = return () logR l msg = do let (r, v) = ngxRequestPtr &&& skipRPtr $ msg logM l r $ C8.dropWhile isSpace v