wai-logger-prefork-0.3.0/0000755000000000000000000000000012021005705013373 5ustar0000000000000000wai-logger-prefork-0.3.0/LICENSE0000644000000000000000000000276512021005705014412 0ustar0000000000000000Copyright (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. wai-logger-prefork-0.3.0/Setup.hs0000644000000000000000000000005612021005705015030 0ustar0000000000000000import Distribution.Simple main = defaultMain wai-logger-prefork-0.3.0/wai-logger-prefork.cabal0000644000000000000000000000207112021005705020062 0ustar0000000000000000Name: wai-logger-prefork Version: 0.3.0 Author: Kazu Yamamoto Maintainer: Kazu Yamamoto 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 Exposed-Modules: Network.Wai.Logger.Prefork Other-Modules: Network.Wai.Logger.Prefork.File Network.Wai.Logger.Prefork.Types Build-Depends: base >= 4 && < 5 , bytestring , date-cache , fast-logger , http-types , unix , wai , wai-logger >= 0.3 Source-Repository head Type: git Location: git clone git://github.com/kazu-yamamoto/logger.git wai-logger-prefork-0.3.0/Network/0000755000000000000000000000000012021005705015024 5ustar0000000000000000wai-logger-prefork-0.3.0/Network/Wai/0000755000000000000000000000000012021005705015544 5ustar0000000000000000wai-logger-prefork-0.3.0/Network/Wai/Logger/0000755000000000000000000000000012021005705016763 5ustar0000000000000000wai-logger-prefork-0.3.0/Network/Wai/Logger/Prefork.hs0000644000000000000000000000316012021005705020727 0ustar0000000000000000module Network.Wai.Logger.Prefork ( logCheck , logInit , logController , LogController , LogType(..) , FileLogSpec(..) , LogFlusher ) where import Control.Concurrent import Control.Monad import Network.Wai.Logger import Network.Wai.Logger.Prefork.File import Network.Wai.Logger.Prefork.Types import System.Date.Cache import System.Log.FastLogger -- | -- Checking if a log file can be written if 'LogType' is 'LogFile'. logCheck :: LogType -> IO () logCheck LogNone = return () logCheck LogStdout = return () logCheck (LogFile spec _) = check spec -- | -- Creating 'ApacheLogger' according to 'LogType'. logInit :: IPAddrSource -> LogType -> IO (ApacheLogger, LogFlusher) logInit _ LogNone = noLoggerInit logInit ipsrc LogStdout = stdoutLoggerInit ipsrc logInit ipsrc (LogFile spec signal) = fileLoggerInit ipsrc spec signal noLoggerInit :: IO (ApacheLogger, LogFlusher) noLoggerInit = return $! (noLogger, noFlusher) where noLogger _ _ _ = return () noFlusher = return () stdoutLoggerInit :: IPAddrSource -> IO (ApacheLogger, LogFlusher) stdoutLoggerInit ipsrc = do dc <- clockDateCacher zonedDateCacheConf lgr <- stdoutApacheLoggerInit2 ipsrc True dc return $! (lgr, return ()) -- | -- Creating a log controller against child processes. logController :: LogType -> LogController logController LogNone = noLoggerController logController LogStdout = noLoggerController logController (LogFile spec signal) = fileLoggerController spec signal noLoggerController :: LogController noLoggerController _ = forever $ threadDelay maxBound wai-logger-prefork-0.3.0/Network/Wai/Logger/Prefork/0000755000000000000000000000000012021005705020373 5ustar0000000000000000wai-logger-prefork-0.3.0/Network/Wai/Logger/Prefork/File.hs0000644000000000000000000000521412021005705021610 0ustar0000000000000000module 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.Date.Cache import System.IO import System.Log.FastLogger import System.Posix ---------------------------------------------------------------- newtype LoggerRef = LoggerRef (IORef Logger) getLogger :: LoggerRef -> IO Logger getLogger (LoggerRef ref) = readIORef ref setLogger :: LoggerRef -> Logger -> IO () setLogger (LoggerRef ref) = writeIORef ref ---------------------------------------------------------------- type LogFlusher = IO () fileLoggerInit :: IPAddrSource -> FileLogSpec -> Signal -> IO (ApacheLogger, LogFlusher) fileLoggerInit ipsrc spec signal = do hdl <- open spec dc <- clockDateCacher zonedDateCacheConf logger <- mkLogger2 False hdl dc logref <- LoggerRef <$> newIORef logger void . forkIO $ fileFlusher logref void $ installHandler signal (Catch $ reopen spec logref) Nothing return (fileLogger ipsrc logref, fileFlusher' logref) open :: FileLogSpec -> IO Handle open spec = openFile (log_file spec) AppendMode reopen :: FileLogSpec -> LoggerRef -> IO () reopen spec logref = do oldlogger <- getLogger logref newlogger <- open spec >>= renewLogger oldlogger setLogger logref newlogger ---------------------------------------------------------------- fileLogger :: IPAddrSource -> LoggerRef -> ApacheLogger fileLogger ipsrc logref req status msiz = do logger <- getLogger logref date <- loggerDate logger loggerPutStr logger $ apacheFormat ipsrc date req status msiz fileFlusher :: LoggerRef -> IO () fileFlusher logref = forever $ do threadDelay 10000000 fileFlusher' logref fileFlusher' :: LoggerRef -> IO () fileFlusher' logref = getLogger logref >>= loggerFlush ---------------------------------------------------------------- fileLoggerController :: FileLogSpec -> Signal -> LogController fileLoggerController spec signal 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 signal pid `catch` ignore handler :: SomeException -> IO Bool handler _ = return False ignore :: SomeException -> IO () ignore _ = return () wai-logger-prefork-0.3.0/Network/Wai/Logger/Prefork/Types.hs0000644000000000000000000000061112021005705022031 0ustar0000000000000000module Network.Wai.Logger.Prefork.Types ( FileLogSpec(..) , LogType(..) , LogController ) where import System.Log.FastLogger import System.Posix (ProcessID, Signal) data LogType = LogNone | LogStdout -- | 'Signal' is used to tell child processes to reopen a log file. | LogFile FileLogSpec Signal type LogController = [ProcessID] -> IO ()