packages feed

wai-logger-prefork (empty) → 0.1.0

raw patch · 7 files changed

+226/−0 lines, 7 filesdep +basedep +bytestringdep +fast-loggersetup-changed

Dependencies added: base, bytestring, fast-logger, http-types, unix, wai, wai-logger

Files

+ LICENSE view
@@ -0,0 +1,29 @@+Copyright (c) 2009, IIJ Innovation Institute Inc.+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++  * Redistributions of source code must retain the above copyright+    notice, this list of conditions and the following disclaimer.+  * Redistributions in binary form must reproduce the above copyright+    notice, this list of conditions and the following disclaimer in+    the documentation and/or other materials provided with the+    distribution.+  * Neither the name of the copyright holders nor the names of its+    contributors may be used to endorse or promote products derived+    from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE+POSSIBILITY OF SUCH DAMAGE.
+ Network/Wai/Logger/Prefork.hs view
@@ -0,0 +1,41 @@+module Network.Wai.Logger.Prefork (+    logCheck+  , logInit+  , logController+  , ApacheLogger+  , LogType(..)+  , IPAddrSource(..)+  , FileLogSpec(..)+  , LogController+  ) where++import Control.Concurrent+import Control.Monad+import Network.Wai.Logger+import Network.Wai.Logger.Prefork.File+import Network.Wai.Logger.Prefork.Stdout+import Network.Wai.Logger.Prefork.Types+import System.Log.FastLogger++logCheck :: LogType -> IO ()+logCheck LogNone   = return ()+logCheck LogStdout = return ()+logCheck (LogFile spec) = check spec++logInit :: IPAddrSource -> LogType -> IO ApacheLogger+logInit _ LogNone            = noLoggerInit+logInit ipsrc LogStdout      = stdoutLoggerInit ipsrc+logInit ipsrc (LogFile spec) = fileLoggerInit ipsrc spec++noLoggerInit :: IO ApacheLogger+noLoggerInit = return noLogger+  where+    noLogger _ _ _ = return ()++logController :: LogType -> LogController+logController LogNone        = noLoggerController+logController LogStdout      = noLoggerController+logController (LogFile spec) = fileLoggerController spec++noLoggerController :: LogController+noLoggerController _ = forever $ threadDelay 10000000
+ Network/Wai/Logger/Prefork/File.hs view
@@ -0,0 +1,94 @@+{-# LANGUAGE DoAndIfThenElse #-}++module Network.Wai.Logger.Prefork.File where++import Control.Applicative+import Control.Concurrent+import Control.Exception (handle, SomeException, catch)+import Control.Monad+import Data.IORef+import Network.Wai.Logger+import Network.Wai.Logger.Prefork.Types+import Prelude hiding (catch)+import System.IO+import System.Log.FastLogger+import System.Posix++----------------------------------------------------------------++logBufSize :: Int+logBufSize = 4096++----------------------------------------------------------------++newtype HandleRef = HandleRef (IORef Handle)++getHandle :: HandleRef -> IO Handle+getHandle (HandleRef ref) = readIORef ref++----------------------------------------------------------------++fileLoggerInit :: IPAddrSource -> FileLogSpec -> IO ApacheLogger+fileLoggerInit ipsrc spec = do+    hdl <- open spec+    hdlref <- HandleRef <$> newIORef hdl+    forkIO $ fileFlusher hdlref+    dateref <- dateInit+    installHandler sigUSR1 (Catch $ reopen spec hdlref) Nothing+    return $ fileLogger ipsrc dateref hdlref++{-+ For BlockBuffering, hPut flushes the buffer before writing+ the target string. In other words, hPut does not split+ the target string. So, to implment multiple line buffering,+ just use BlockBuffering.+-}+open :: FileLogSpec -> IO Handle+open spec = do+    hdl <- openFile file AppendMode+    hSetBuffering hdl (BlockBuffering (Just logBufSize))+    return hdl+  where+    file = log_file spec++reopen :: FileLogSpec -> HandleRef -> IO ()+reopen spec (HandleRef ref) = do+    hdl <- open spec+    oldhdl <- atomicModifyIORef ref (\oh -> (hdl,oh))+    hClose oldhdl++----------------------------------------------------------------++fileLogger :: IPAddrSource -> DateRef -> HandleRef -> ApacheLogger+fileLogger ipsrc dateref hdlref req status msiz = do+    date <- getDate dateref+    hdl <- getHandle hdlref+    hPutLogStr hdl $ apacheFormat ipsrc date req status msiz++fileFlusher :: HandleRef -> IO ()+fileFlusher hdlref = forever $ do+    threadDelay 10000000+    getHandle hdlref >>= hFlush++----------------------------------------------------------------++fileLoggerController :: FileLogSpec -> LogController+fileLoggerController spec pids = forever $ do+    isOver <- over+    when isOver $ do+        rotate spec+        mapM_ sendSignal pids+    threadDelay 10000000+  where+    file = log_file spec+    over = handle handler $ do+        siz <- fromIntegral . fileSize <$> getFileStatus file+        if siz > log_file_size spec then+            return True+        else+            return False+    sendSignal pid = signalProcess sigUSR1 pid `catch` ignore+    handler :: SomeException -> IO Bool+    handler _ = return False+    ignore :: SomeException -> IO ()+    ignore _ = return ()
+ Network/Wai/Logger/Prefork/Stdout.hs view
@@ -0,0 +1,21 @@+module Network.Wai.Logger.Prefork.Stdout (stdoutLoggerInit) where++import Control.Applicative+import qualified Data.ByteString as BS+import Data.ByteString.Char8 (pack)+import Network.Wai.Logger+import Network.Wai.Logger.Prefork.Types+import System.Log.FastLogger++stdoutLoggerInit :: IPAddrSource -> IO ApacheLogger+stdoutLoggerInit ipsrc = stdoutLogger ipsrc <$> dateInit++stdoutLogger :: IPAddrSource -> DateRef -> ApacheLogger+stdoutLogger ipsrc dateref req status msiz = do+    date <- getDate dateref+    putToStdout $ logmsg date+  where+    putToStdout = BS.putStr . BS.concat . map toBS+    logmsg date = apacheFormat ipsrc date req status msiz+    toBS (LS s) = pack s+    toBS (LB s) = s
+ Network/Wai/Logger/Prefork/Types.hs view
@@ -0,0 +1,17 @@+module Network.Wai.Logger.Prefork.Types (+    ApacheLogger+  , FileLogSpec(..)+  , LogType(..)+  , LogController+  ) where++import Network.HTTP.Types+import Network.Wai+import System.Log.FastLogger+import System.Posix (ProcessID)++data LogType = LogNone | LogStdout | LogFile FileLogSpec++type ApacheLogger = Request -> Status -> Maybe Integer -> IO ()++type LogController = [ProcessID] -> IO ()
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ wai-logger-prefork.cabal view
@@ -0,0 +1,22 @@+Name:                   wai-logger-prefork+Version:                0.1.0+Author:                 Kazu Yamamoto <kazu@iij.ad.jp>+Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>+License:                BSD3+License-File:           LICENSE+Synopsis:               A logging system for preforked WAI apps+Description:            A logging system for preforked WAI apps+Category:               Web, Yesod+Cabal-Version:          >= 1.6+Build-Type:             Simple+library+  GHC-Options:          -Wall -fno-warn-unused-do-bind+  Exposed-Modules:      Network.Wai.Logger.Prefork+  Other-Modules:        Network.Wai.Logger.Prefork.File+                        Network.Wai.Logger.Prefork.Stdout+                        Network.Wai.Logger.Prefork.Types+  Build-Depends:        base >= 4 && < 5, unix, bytestring,+                        wai, fast-logger, wai-logger, http-types+Source-Repository head+  Type:                 git+  Location:             git://github.com/kazu-yamamoto/wai-logger-prefork.git