@@ -1,7 +1,10 @@
2module Control.Logger
2module Control.Logger
4 , loggerContext
4 , loggerContext
6 , logMsgWith
9 , logMsgWith
@@ -32,20 +35,27 @@ module Control.Logger
32 , compactCallStack
35 , compactCallStack
34 , ToObject(..)
37 , ToObject(..)
37import Control.Has
43import Control.Has
44+import Control.Lens hiding (censoring)
38import Control.Logger.Internal
45import Control.Logger.Internal
39−import Control.Logger.Orphans ()
46+import Control.Logger.Orphans ()
40import Control.Monad.Catch
48import Control.Monad.Catch
49+import Control.Monad.IO.Class
41−import qualified Data.List as List
50+import qualified Data.List as List
42−import Data.Text (Text)
51+import Data.Monoid
52+import Data.Text (Text)
43−import qualified Data.Text as Text
53+import qualified Data.Text as Text
44import Data.Time
54import Data.Time
45import GHC.Stack
55import GHC.Stack
46−import Katip (ToObject(..))
56+import Katip (ToObject (..))
47import System.Log.FastLogger
57import System.Log.FastLogger
48−import Text.Shakespeare.Text (st)
58+import Text.Shakespeare.Text (st)
51 :: (LoggingMonad r m)
61 :: (LoggingMonad r m)
@@ -99,6 +109,50 @@ logErrorWith
100logErrorWith logger msg = withFrozenCallStack (logMsgWith logger Error msg)
110logErrorWith logger msg = withFrozenCallStack (logMsgWith logger Error msg)
112+safeReplace :: Text -> Text -> Text -> Text
113+safeReplace what with where_
114+ | Text.null what = where_
115+ | otherwise = Text.replace what with where_
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)
122+-- | Censor with "***"
123+censor :: Text -> Logger -> Logger
124+censor = censorWith "***"
126+-- | Run an action with adjusted scrubber
128+ :: forall r m a. (Has Logger r, MonadReader r m)
129+ => (Endo Text -> Endo Text)
132+withScrubber scrubF = local expandScrubber
134+ expandScrubber :: r -> r
135+ expandScrubber = over part (over scrubber scrubF)
137+-- | Run an action while censoring additional text from logs
139+ :: (Has Logger r, MonadReader r m)
144+censoringWith replacement txt = withScrubber (<> censored)
146+ censored = Endo (safeReplace txt replacement)
148+-- | Run an action while censoring additional text from logs
150+ :: (Has Logger r, MonadReader r m)
154+censoring = censoringWith "***"
102-- | Log exceptions occured in computation and just ignore them.
156-- | Log exceptions occured in computation and just ignore them.
103tryLogError
157tryLogError
104 :: (MonadIO m, MonadCatch m, Has Logger r, MonadReader r m)
158 :: (MonadIO m, MonadCatch m, Has Logger r, MonadReader r m)
@@ -149,14 +203,14 @@ fileLogger :: MonadIO m => FilePath -> m Logger
149fileLogger fp = fastFunc <$> liftIO (newFileLoggerSet defaultBufSize fp)
203fileLogger fp = fastFunc <$> liftIO (newFileLoggerSet defaultBufSize fp)
151silentLogger :: Logger
205silentLogger :: Logger
152−silentLogger = Logger mempty (\_ _ _ _ -> return ())
206+silentLogger = Logger mempty mempty (\_ _ _ _ -> return ())
154-- | Logger which flushes buffer after each message. This is useful with
208-- | Logger which flushes buffer after each message. This is useful with
155-- stderrLogger.
209-- stderrLogger.
156flushingFastFunc
210flushingFastFunc
157 :: LogSeverity -> LoggerSet -> Logger
211 :: LogSeverity -> LoggerSet -> Logger
158flushingFastFunc minLogLevel loggerSet =
212flushingFastFunc minLogLevel loggerSet =
159− Logger mempty $ \_ stack logLevel msg ->
213+ Logger mempty mempty $ \_ stack logLevel msg ->
160 when (logLevel >= minLogLevel) $ do
214 when (logLevel >= minLogLevel) $ do
161 ts <- getCurrentTime
215 ts <- getCurrentTime
162 pushLogStr loggerSet
216 pushLogStr loggerSet
@@ -180,14 +234,14 @@ flushingStderrLogger =
180-- | Make our outdated 'Logger' of fast-logger's 'LoggerSet'
234-- | Make our outdated 'Logger' of fast-logger's 'LoggerSet'
181fastFunc :: LoggerSet -> Logger
235fastFunc :: LoggerSet -> Logger
182fastFunc loggerSet =
236fastFunc loggerSet =
183− Logger mempty $ \_ _ _ msg -> pushLogStr loggerSet $ toLogStr msg
237+ Logger mempty mempty $ \_ _ _ msg -> pushLogStr loggerSet $ toLogStr msg
185type LogSource = Text
239type LogSource = Text
187-- | Default logger tests and same things.
241-- | Default logger tests and same things.
188defaultFastFunc :: LogSource -> LogSeverity -> LoggerSet -> Logger
242defaultFastFunc :: LogSource -> LogSeverity -> LoggerSet -> Logger
189defaultFastFunc loc minLogLevel loggerSet =
243defaultFastFunc loc minLogLevel loggerSet =
190− Logger mempty $ \_ stack s msg -> when (s >= minLogLevel) $ do
244+ Logger mempty mempty $ \_ stack s msg -> when (s >= minLogLevel) $ do
191 ts <- getCurrentTime
245 ts <- getCurrentTime
192 pushLogStr loggerSet $ formatLogStr ts stack loc s (toLogStr msg)
246 pushLogStr loggerSet $ formatLogStr ts stack loc s (toLogStr msg)