# A python logging style log library. ### A full example: ```haskell {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TemplateHaskell #-} module Main (main) where import Data.Aeson.QQ.Simple (aesonQQ) import Prelude hiding (error) import Logging (runJson, debug, info, warn, error, fatal, logv) main :: IO () main = runJson manager app myLogger = "MyLogger.Main" app :: IO () app = do $(debug) myLogger "this message should print into MyLogger" $(info) myLogger "this message should print into MyLogger" $(warn) myLogger "this message should print into MyLogger" $(error) myLogger "this message should print into MyLogger" $(fatal) myLogger "this message should print into MyLogger" $(logv) myLogger "LEVEL 100" "this message should print into MyLogger" -- The best practice is putting all config into a separate file, -- e.g "Logging.json" manager = [aesonQQ|{ "loggers": { "root": { "level": "DEBUG", "handlers": ["console"], "propagate": false }, "MyLogger": { "level": "INFO", "filterer": ["MyLogger.Main"], "handlers": ["file"], "propagate": false } }, "handlers": { "console": { "type": "StreamHandler", "stream": "stderr", "level": "DEBUG", "formatter": "defaultFormatter" }, "file": { "type": "FileHandler", "level": "INFO", "formatter": "defaultFormatter", "file": "./default.log" } }, "formatters": { "defaultFormatter": { "fmt": "%(asctime)s - %(level)s - %(logger)s - %(pathname)s/%(filename)s:%(lineno)d] %(message)s" } } }|] ```