@@ -2,6 +2,9 @@
2module Control.Logger
2module Control.Logger
4 , loggerContext
4 , loggerContext
6 , logMsgWith
9 , logMsgWith
@@ -32,13 +35,18 @@ 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
39import Control.Logger.Orphans ()
46import Control.Logger.Orphans ()
40import Control.Monad.Catch
47import Control.Monad.Catch
41import qualified Data.List as List
48import qualified Data.List as List
42import Data.Text (Text)
50import Data.Text (Text)
43import qualified Data.Text as Text
51import qualified Data.Text as Text
44import Data.Time
52import Data.Time
@@ -46,6 +54,7 @@ import GHC.Stack
46import Katip (ToObject (..))
54import Katip (ToObject (..))
47import System.Log.FastLogger
55import System.Log.FastLogger
48import Text.Shakespeare.Text (st)
56import Text.Shakespeare.Text (st)
57+-- import Control.Monad.RWS (censor)
49#if MIN_VERSION_mtl(2,3,0)
58#if MIN_VERSION_mtl(2,3,0)
50import Control.Monad
59import Control.Monad
51import Control.Monad.IO.Class
60import Control.Monad.IO.Class
@@ -103,6 +112,50 @@ logErrorWith
104logErrorWith logger msg = withFrozenCallStack (logMsgWith logger Error msg)
113logErrorWith logger msg = withFrozenCallStack (logMsgWith logger Error msg)
115+safeReplace :: Text -> Text -> Text -> Text
116+safeReplace what with where_
117+ | Text.null what = where_
118+ | otherwise = Text.replace what with where_
120+-- | Add a some text to scrubber
121+censorWith :: Text -> Text -> Logger -> Logger
122+censorWith replacement needle l =
123+ l & scrubber <>~ Endo (safeReplace needle replacement)
125+-- | Censor with "***"
126+censor :: Text -> Logger -> Logger
127+censor = censorWith "***"
129+-- | Run an action with adjusted scrubber
131+ :: forall r m a. (Has Logger r, MonadReader r m)
132+ => (Endo Text -> Endo Text)
135+withScrubber scrubF = local expandScrubber
137+ expandScrubber :: r -> r
138+ expandScrubber = over part (over scrubber scrubF)
140+-- | Run an action while censoring additional text from logs
142+ :: (Has Logger r, MonadReader r m)
147+censoringWith replacement txt = withScrubber (<> censored)
149+ censored = Endo (safeReplace txt replacement)
151+-- | Run an action while censoring additional text from logs
153+ :: (Has Logger r, MonadReader r m)
157+censoring = censoringWith "***"
106-- | Log exceptions occured in computation and just ignore them.
159-- | Log exceptions occured in computation and just ignore them.
107tryLogError
160tryLogError
108 :: (MonadIO m, MonadCatch m, Has Logger r, MonadReader r m)
161 :: (MonadIO m, MonadCatch m, Has Logger r, MonadReader r m)
@@ -153,14 +206,14 @@ fileLogger :: MonadIO m => FilePath -> m Logger
153fileLogger fp = fastFunc <$> liftIO (newFileLoggerSet defaultBufSize fp)
206fileLogger fp = fastFunc <$> liftIO (newFileLoggerSet defaultBufSize fp)
155silentLogger :: Logger
208silentLogger :: Logger
156−silentLogger = Logger mempty (\_ _ _ _ -> return ())
209+silentLogger = Logger mempty mempty (\_ _ _ _ -> return ())
158-- | Logger which flushes buffer after each message. This is useful with
211-- | Logger which flushes buffer after each message. This is useful with
159-- stderrLogger.
212-- stderrLogger.
160flushingFastFunc
213flushingFastFunc
161 :: LogSeverity -> LoggerSet -> Logger
214 :: LogSeverity -> LoggerSet -> Logger
162flushingFastFunc minLogLevel loggerSet =
215flushingFastFunc minLogLevel loggerSet =
163− Logger mempty $ \_ stack logLevel msg ->
216+ Logger mempty mempty $ \_ stack logLevel msg ->
164 when (logLevel >= minLogLevel) $ do
217 when (logLevel >= minLogLevel) $ do
165 ts <- getCurrentTime
218 ts <- getCurrentTime
166 pushLogStr loggerSet
219 pushLogStr loggerSet
@@ -184,14 +237,14 @@ flushingStderrLogger =
184-- | Make our outdated 'Logger' of fast-logger's 'LoggerSet'
237-- | Make our outdated 'Logger' of fast-logger's 'LoggerSet'
185fastFunc :: LoggerSet -> Logger
238fastFunc :: LoggerSet -> Logger
186fastFunc loggerSet =
239fastFunc loggerSet =
187− Logger mempty $ \_ _ _ msg -> pushLogStr loggerSet $ toLogStr msg
240+ Logger mempty mempty $ \_ _ _ msg -> pushLogStr loggerSet $ toLogStr msg
189type LogSource = Text
242type LogSource = Text
191-- | Default logger tests and same things.
244-- | Default logger tests and same things.
192defaultFastFunc :: LogSource -> LogSeverity -> LoggerSet -> Logger
245defaultFastFunc :: LogSource -> LogSeverity -> LoggerSet -> Logger
193defaultFastFunc loc minLogLevel loggerSet =
246defaultFastFunc loc minLogLevel loggerSet =
194− Logger mempty $ \_ stack s msg -> when (s >= minLogLevel) $ do
247+ Logger mempty mempty $ \_ stack s msg -> when (s >= minLogLevel) $ do
195 ts <- getCurrentTime
248 ts <- getCurrentTime
196 pushLogStr loggerSet $ formatLogStr ts stack loc s (toLogStr msg)
249 pushLogStr loggerSet $ formatLogStr ts stack loc s (toLogStr msg)