filter-logger alternatives and similar packages
Based on the "Web" category.
Alternatively, view filter-logger alternatives based on common mentions on social networks and blogs.
-
scotty
Haskell web framework inspired by Ruby's Sinatra, using WAI and Warp (Official Repository) -
swagger-petstore
swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. -
yesod-persistent
A RESTful Haskell web framework built on WAI. -
haskell-bitmex-rest
swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. -
servant
Main repository for the servant libraries — DSL for describing, serving, querying, mocking, documenting web applications and more! -
neuron
Future-proof note-taking and publishing based on Zettelkasten (superseded by Emanote: https://github.com/srid/emanote) -
haskell-kubernetes
Haskell bindings to the Kubernetes API (via swagger-codegen) -
apecs-gloss
a fast, extensible, type driven Haskell ECS framework for games -
airship
Helium + Webmachine = Airship. A toolkit for building declarative, RESTful web apps. -
tagsoup
Haskell library for parsing and extracting information from (possibly malformed) HTML/XML documents -
servant-elm
Automatically derive Elm functions to query servant webservices -
hbro
[Unmaintained] A minimal web-browser written and configured in Haskell. -
digestive-functors
A general way to consume input using applicative functors -
backprop
Heterogeneous automatic differentiation ("backpropagation") in Haskell -
kubernetes-client-core
Haskell client for the kubernetes API. A work in progress. -
keera-hails-reactive-htmldom
Keera Hails: Haskell on Rails - Reactive Programming Framework for Interactive Haskell applications -
engine-io
A Haskell server implementation of the Engine.IO and Socket.IO (1.0) protocols -
ghcjs-dom
Make Document Object Model (DOM) apps that run in any browser and natively using WebKitGtk -
ghcjs-base
base library for GHCJS for JavaScript interaction and marshalling, used by higher level libraries like JSC
Collect and Analyze Billions of Data Points in Real Time
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of filter-logger or a related project?
README
filter-logger
Filterable request logging as a wai middleware. Change what data is logged and when.
Usage
Here is one example from the examples/password directory where we use the filter logger to implement password filtering. The example uses scotty
for our web server, and we use the logShowJSON
and logFilterJSON
helper functions to help us create our instances.
Password Filtering
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Main where
import Data.Aeson
import GHC.Generics
import Network.Wai.Middleware.FilterLogger
import Web.Scotty
data LoginRequest = LoginRequest {
username :: String
, password :: String
} deriving (Generic)
instance FromJSON LoginRequest where
instance ToJSON LoginRequest where
instance LogShowable LoginRequest where
logShow = logShowJSON
instance LogFilterable LoginRequest where
prep = logFilterJSON
instance Loggable LoginRequest where
main :: IO ()
main = scotty 3000 $ do
middleware filterPasswords
post "/" $ text "SUCCESS"
filterPasswords =
mkDefaultFilterLogger hidePasswords
where hidePasswords r@LoginRequest{..} = Just r {password = "*****"}
Sending a POST request to localhost:3000 with a body like
{
"username": "test-username",
"password": "myPassw0rd123"
}
will result in a log message like
11/Jul/2017:21:48:20 -0400
200 - OK
0.03ms
{
"username": "test-username",
"password": "*****"
}
Chaining Filters
Here is a rather contrived example showing that you can chain these filters together easily and do all sorts of filtering.
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad
import qualified Data.ByteString as BS (elem, length)
import Data.Char
import Data.Word
import Network.Wai.Middleware.FilterLogger
import Web.Scotty
main :: IO ()
main = scotty 3000 $ do
middleware filteringMiddleware
post "/" $ text "SUCCESS"
filteringMiddleware =
mkDefaultFilterLogger (keepShortBodies >=> containing 'c')
where keepShortBodies bs
| BS.length bs < 10 = Just bs
| otherwise = Nothing
containing c bs
| BS.elem (fromIntegral $ ord c) bs = Just bs
| otherwise = Nothing
Sending a POST request to localhost:3000 with a body like
abcdefghi
will result in a log message like
11/Jul/2017:22:00:59 -0400
200 - OK
0.03ms
abcdefghi
If you send a POST request with a body like
abcdefghij
or
abdefghij
you won't see anything in the server logs.
Customization
Customizing the log filtering middleware can be done with the FilterOptions
type. It supports two options currently:
- Detailed logging: Includes the request duration in milliseconds and the response body size.
True
by default. - Log when the request body is empty: Boolean value indicating whether or not to create log messages when there is no request body.
True
by default.