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 +29/−0
- Network/Wai/Logger/Prefork.hs +41/−0
- Network/Wai/Logger/Prefork/File.hs +94/−0
- Network/Wai/Logger/Prefork/Stdout.hs +21/−0
- Network/Wai/Logger/Prefork/Types.hs +17/−0
- Setup.hs +2/−0
- wai-logger-prefork.cabal +22/−0
+ 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