@@ -1,7 +1,10 @@
1−
1+{-# LANGUAGE CPP #-}
22module Control.Logger
33 ( Logger
44 , loggerContext
5+ , scrubber
6+ , censor
7+ , censorWith
58 , logMsg
69 , logMsgWith
710 , logInfo
@@ -32,20 +35,27 @@ module Control.Logger
3235 , compactCallStack
3336 , st
3437 , ToObject(..)
38+ , withScrubber
39+ , censoringWith
40+ , censoring
3541 ) where
3642
3743import Control.Has
44+import Control.Lens hiding (censoring)
3845import Control.Logger.Internal
39−import Control.Logger.Orphans ()
46+import Control.Logger.Orphans ()
47+import Control.Monad
4048import Control.Monad.Catch
41−import qualified Data.List as List
42−import Data.Text (Text)
43−import qualified Data.Text as Text
49+import Control.Monad.IO.Class
50+import qualified Data.List as List
51+import Data.Monoid
52+import Data.Text (Text)
53+import qualified Data.Text as Text
4454import Data.Time
4555import GHC.Stack
46−import Katip (ToObject(..))
56+import Katip (ToObject (..))
4757import System.Log.FastLogger
48−import Text.Shakespeare.Text (st)
58+import Text.Shakespeare.Text (st)
4959
5060logError
5161 :: (LoggingMonad r m)
@@ -99,6 +109,50 @@ logErrorWith
99109 -> m ()
100110logErrorWith logger msg = withFrozenCallStack (logMsgWith logger Error msg)
101111
112+safeReplace :: Text -> Text -> Text -> Text
113+safeReplace what with where_
114+ | Text.null what = where_
115+ | otherwise = Text.replace what with where_
116+
117+-- | Add a some text to scrubber
118+censorWith :: Text -> Text -> Logger -> Logger
119+censorWith replacement needle l =
120+ l & scrubber <>~ Endo (safeReplace needle replacement)
121+
122+-- | Censor with "***"
123+censor :: Text -> Logger -> Logger
124+censor = censorWith "***"
125+
126+-- | Run an action with adjusted scrubber
127+withScrubber
128+ :: forall r m a. (Has Logger r, MonadReader r m)
129+ => (Endo Text -> Endo Text)
130+ -> m a
131+ -> m a
132+withScrubber scrubF = local expandScrubber
133+ where
134+ expandScrubber :: r -> r
135+ expandScrubber = over part (over scrubber scrubF)
136+
137+-- | Run an action while censoring additional text from logs
138+censoringWith
139+ :: (Has Logger r, MonadReader r m)
140+ => Text
141+ -> Text
142+ -> m a
143+ -> m a
144+censoringWith replacement txt = withScrubber (<> censored)
145+ where
146+ censored = Endo (safeReplace txt replacement)
147+
148+-- | Run an action while censoring additional text from logs
149+censoring
150+ :: (Has Logger r, MonadReader r m)
151+ => Text
152+ -> m a
153+ -> m a
154+censoring = censoringWith "***"
155+
102156-- | Log exceptions occured in computation and just ignore them.
103157tryLogError
104158 :: (MonadIO m, MonadCatch m, Has Logger r, MonadReader r m)
@@ -149,14 +203,14 @@ fileLogger :: MonadIO m => FilePath -> m Logger
149203fileLogger fp = fastFunc <$> liftIO (newFileLoggerSet defaultBufSize fp)
150204
151205silentLogger :: Logger
152−silentLogger = Logger mempty (\_ _ _ _ -> return ())
206+silentLogger = Logger mempty mempty (\_ _ _ _ -> return ())
153207
154208-- | Logger which flushes buffer after each message. This is useful with
155209-- stderrLogger.
156210flushingFastFunc
157211 :: LogSeverity -> LoggerSet -> Logger
158212flushingFastFunc minLogLevel loggerSet =
159− Logger mempty $ \_ stack logLevel msg ->
213+ Logger mempty mempty $ \_ stack logLevel msg ->
160214 when (logLevel >= minLogLevel) $ do
161215 ts <- getCurrentTime
162216 pushLogStr loggerSet
@@ -180,14 +234,14 @@ flushingStderrLogger =
180234-- | Make our outdated 'Logger' of fast-logger's 'LoggerSet'
181235fastFunc :: LoggerSet -> Logger
182236fastFunc loggerSet =
183− Logger mempty $ \_ _ _ msg -> pushLogStr loggerSet $ toLogStr msg
237+ Logger mempty mempty $ \_ _ _ msg -> pushLogStr loggerSet $ toLogStr msg
184238
185239type LogSource = Text
186240
187241-- | Default logger tests and same things.
188242defaultFastFunc :: LogSource -> LogSeverity -> LoggerSet -> Logger
189243defaultFastFunc loc minLogLevel loggerSet =
190− Logger mempty $ \_ stack s msg -> when (s >= minLogLevel) $ do
244+ Logger mempty mempty $ \_ stack s msg -> when (s >= minLogLevel) $ do
191245 ts <- getCurrentTime
192246 pushLogStr loggerSet $ formatLogStr ts stack loc s (toLogStr msg)
193247