{-# 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
data LogLevel = LogStderr
| LogEmerg
| LogAlert
| LogCrit
| LogErr
| LogWarn
| LogNotice
| LogInfo
| LogDebug deriving Int -> LogLevel
LogLevel -> Int
LogLevel -> [LogLevel]
LogLevel -> LogLevel
LogLevel -> LogLevel -> [LogLevel]
LogLevel -> LogLevel -> LogLevel -> [LogLevel]
(LogLevel -> LogLevel)
-> (LogLevel -> LogLevel)
-> (Int -> LogLevel)
-> (LogLevel -> Int)
-> (LogLevel -> [LogLevel])
-> (LogLevel -> LogLevel -> [LogLevel])
-> (LogLevel -> LogLevel -> [LogLevel])
-> (LogLevel -> LogLevel -> LogLevel -> [LogLevel])
-> Enum LogLevel
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: LogLevel -> LogLevel
succ :: LogLevel -> LogLevel
$cpred :: LogLevel -> LogLevel
pred :: LogLevel -> LogLevel
$ctoEnum :: Int -> LogLevel
toEnum :: Int -> LogLevel
$cfromEnum :: LogLevel -> Int
fromEnum :: LogLevel -> Int
$cenumFrom :: LogLevel -> [LogLevel]
enumFrom :: LogLevel -> [LogLevel]
$cenumFromThen :: LogLevel -> LogLevel -> [LogLevel]
enumFromThen :: LogLevel -> LogLevel -> [LogLevel]
$cenumFromTo :: LogLevel -> LogLevel -> [LogLevel]
enumFromTo :: LogLevel -> LogLevel -> [LogLevel]
$cenumFromThenTo :: LogLevel -> LogLevel -> LogLevel -> [LogLevel]
enumFromThenTo :: LogLevel -> LogLevel -> LogLevel -> [LogLevel]
Enum
logG :: LogLevel
-> ByteString
-> IO ()
logG :: LogLevel -> ByteString -> IO ()
logG LogLevel
_ ByteString
"" = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
logG LogLevel
l ByteString
msg = do
Ptr ()
c <- IO (Ptr ())
ngxCyclePtr
ByteString -> (CStringLen -> IO ()) -> IO ()
forall a. ByteString -> (CStringLen -> IO a) -> IO a
B.unsafeUseAsCStringLen ByteString
msg ((CStringLen -> IO ()) -> IO ()) -> (CStringLen -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
\(Ptr CChar
x, Int
i) -> CLogType
c_log Ptr ()
c (Int -> CUIntPtr
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CUIntPtr) -> Int -> CUIntPtr
forall a b. (a -> b) -> a -> b
$ LogLevel -> Int
forall a. Enum a => a -> Int
fromEnum LogLevel
l) Ptr CChar
x (CSize -> IO ()) -> CSize -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i
logM :: LogLevel
-> Ptr ()
-> ByteString
-> IO ()
logM :: LogLevel -> Ptr () -> ByteString -> IO ()
logM LogLevel
l Ptr ()
r ByteString
msg = ByteString -> (CStringLen -> IO ()) -> IO ()
forall a. ByteString -> (CStringLen -> IO a) -> IO a
B.unsafeUseAsCStringLen ByteString
msg ((CStringLen -> IO ()) -> IO ()) -> (CStringLen -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
\(Ptr CChar
x, Int
i) -> CLogType
c_log_r Ptr ()
r (Int -> CUIntPtr
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CUIntPtr) -> Int -> CUIntPtr
forall a b. (a -> b) -> a -> b
$ LogLevel -> Int
forall a. Enum a => a -> Int
fromEnum LogLevel
l) Ptr CChar
x (CSize -> IO ()) -> CSize -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i
logR :: LogLevel
-> ByteString
-> IO ()
logR :: LogLevel -> ByteString -> IO ()
logR LogLevel
_ ByteString
"" = () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
logR LogLevel
l ByteString
msg = do
let (Ptr ()
r, ByteString
v) = ByteString -> Ptr ()
ngxRequestPtr (ByteString -> Ptr ())
-> (ByteString -> ByteString) -> ByteString -> (Ptr (), ByteString)
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& ByteString -> ByteString
skipRPtr (ByteString -> (Ptr (), ByteString))
-> ByteString -> (Ptr (), ByteString)
forall a b. (a -> b) -> a -> b
$ ByteString
msg
LogLevel -> Ptr () -> ByteString -> IO ()
logM LogLevel
l Ptr ()
r (ByteString -> IO ()) -> ByteString -> IO ()
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> ByteString -> ByteString
C8.dropWhile Char -> Bool
isSpace ByteString
v