úÎ!+D)D     None(Hdi Obtain a  that will write logs in the df1 format to .!Generally, you will want to call - just once per application, right from your main function. For example: main ::   () main = do  $ \di -> do -- #The rest of your program goes here. -- !You can start logging right away.  di $ do ' "Welcome to my program!" --  You can use  to separate different -- logging scopes of your program: ( "initialization" $ do -- %something something do initialization ! "Starting web server"  "server" $ do -- And you can use  to add metadata to -- *messages logged within a particular scope. % "port" "80" $ do A "Listening for new clients" clientAddress <- somehow get a client connection & "handler" $ do > "client-address" clientAddress $ do 6 "Connection established" -- If you throw an exception with , --  it will be logged automatically.  (! "Oops!") 0That program will render something like this to  (in colors!): ÿó2018-05-06T19:48:06.194579393Z NOTICE Welcome to my program! 2018-05-06T19:48:06.195041422Z /initialization NOTICE Starting web server 2018-05-06T19:48:06.195052862Z /server port=80 INFO Listening for new clients 2018-05-06T19:48:06.195059084Z /server port=80 /handler client%2daddress=192%2e168%2e0%2e25%3a32528 INFO Connection established 2018-05-06T19:48:06.195059102Z /server port=80 /handler client%2daddress=192%2e168%2e0%2e25%3a32528 exception=user%20error%20(Oops!) WARNING Exception thrown Notice that by default, all exceptions thrown using  are logged at their throw site with " level.(Unrelated: Notice how df1M escapes pretty much all punctuation characters. This is temporal until the df1U format is formalized and a more limited set of punctuation characters is reserved.)diThis type is the same as  -> m a..^ Within this scope, you can use the obtained ( safely, even concurrently. As soon as m a finishes, G will block until all logs have finished processing, before returning.WARNING: Even while  commit # :: m (    )- type-checks, attempting to use the obtained Di' outside its intended scope will fail.di     $      !"#$%&%&'%&()*+,-./012/345di-1.2-7YJdvXI1XA66Oowqw16BTgDi System.IOstderrthrowdf1-0.3-LLHRK1sd98fEGJiuN7Bdd1 Df1.TypesMessagemessage ToMessageLevelSegmentsegment ToSegmentKeykeyToKeyValuevalueToValuePath#di-df1-1.0.2-81yVF8sOo7M5aH383BtFm9 Di.Df1.Monaddebuginfonoticewarningerrorcriticalalert emergencyattrpushDf1TMonadDf1Di.Df1Df1#di-monad-1.3-EMKBQdmMfk4E7ajnKLTrppDi.MonadhoistDiTrunDiTnew$di-core-1.0.3-BVPqmuYZquQKEtexVUvWjpDi.Coreghc-prim GHC.TypesIObaseGHC.IO.Exception userErrorWarningGHC.Basepure