ic4      !"#$%&'()*+,-./0123 Trustworthy 6 is the type of a full format. It is simply a list of sA  is a formatting element4A 5able formatting element6finaliseFormat finalises a format that represents datetime elements as a UNIX datetime format string and turns them into a formatting closure. This method also concatenates adjacent s76formatParser parses a format string into FormatElemTHs8'elemParser parses a single FormatElemTH9(datetimeParser parses a datetime element$( _) :: a is a template function that parses the passed in format string, then finalises it and returns a . :k$(mat _) :: FormatTH is a template function that parses the passed in format string and returns a FormatTH.;4<=>?@6789:A ;4@?>=<6789:A Trustworthy*136=BHKM1B,An internal datatype used when initialising Ps. It includes all information that the user passed in with the list of loggers.CAn internal datatype used for aggregation of filters as well as keeping track of synchronous and asynchronous logging. This means for example that it is possible to log from two threads into the same file, one synchronously, one asynchronously, using different filters.A  is returned when an  ! is run. You may wait on it with .. ;This is a simple monad for the bottom of one's monad stack. (The SLogT monad transformer is simply a D with an environmentEThe environment of  FThe current thread's nameG=The list of internal loggers together with associated filtersHSame as the user-specified  IThe  of loggingJDThe internal representation of Loggers with open handles, locks and Ks.   is the configuration of  MSpecifies whether ANSI colouring should be used when logging to stdout/stderr8The list of loggers together with the associated filters\ is a log message together with the severity, time of logging and the logging thread's name.! is the type of logging filters. s may only depend on the  .The 1 type specifies the types of sinks we can log to. logs to a specified K . Note that Ys are written instead of the final formatted text. If you wish to use the final text use 1. logs to the stderr logs to the stdoutT specifies a file to be logged in. Note that symbolic links will be resolved using L when deciding whether two s point to the same file.w is a type to specify whether a logger should log synchronously or asynchronously. Syncronous logging means that the logging thread will block until the message has been written and flushed to the sink. Asynchronous logging means that the logging thread will write to a work queue and move on. The work queue will be read by a dedicated thread that is forked for each sink.,The class of monads that can perform logging logs the specified M with the specified  1The type of severities with increasing importance&+The default log format, which currently is $$(format "%d(%F %T) | %s | [%t] %m"). See System.Log.SLog.Format$ for more details on format strings.'Log a % message(Log a # message)Log an $ message*Log a " message+Log an ! messageNSGR code for severity coloursO.Wrap a piece of text in some SGR configuration,, allows all lines to be logged.-- is the default log configuration. It writes all non-DEBUG messages to the stdout synchronously and all messages to a specified file asynchronously... will only return when all resources have been released and all streams have been flushed. Note that this includes resources allocated by the user using the exposed P instance.}All threads internally accounted for are signaled to exit (they will first finish processing of all remaining jobs) when the  R is run, however it is the user's responsibility to shut down threads forked with 2 or Q before . can return.// runs an   given a  , . and the current thread's name. It returns a  besides the usual return value.00V uses the default configuration with the specified log file name. It also waits using .( until all resources have been released.R+initLoggers initialises the user specified 2s and returns the internal representation of them.$This includes first aggregating the >s resolving any ambiguities, then opening the logging streams.SlcanonExist makes sure the specified file exists by creating it if it doesn't, then returns canonicalizePath.T forkCleanup forks a ResIO thread that will get an exit signal through a TVar when the outer ResourceT is run. The forked off ResourceT is the inner oneUThis method aggregates the specified loggers in a meaningful way Ambiguous cases arise when several loggers specify the same file/stream * First off we use canonicalizePath to resolve symlinks * Second, we create a disjunction of the attached filters * Lastly we keep track of synchrony: if there are two loggers specifying the same file, one synchronous the other asynchronous then we keep both filters and will use the a lock in each case.V*asyncLogger is the thread forked for each @ logger. It may be passed a lock to use when logging in case a /hronous logger for the same handle also exists.W<Helper method for choosing coloured vs. non-coloured stringsX#logger performs the actual logging.11 formats the given  using the specified . The Yean determines whether 1( should insert ANSI colour codes or not.22 forks an  ' thread with the specified thread name.Z%helper method for padding with spaces3unsafeUnliftSLog gives you an unsafe unlift of an SLogT by assuming that any unlifted computation will finish earlier than the runSLogT of the calling thread. It is unsafe because if the unlifted computation doesn't finish earlier then it may access deallocated resources. This is useful when a library is implicitly forking but we still need to log in the forked threads, and we know that the child threads will finish earlier than the parent. An example is Network.WebSocketsXB[\]^_C`abc deEfFGHIJghi  !"#$%&'()*+NO,-./0RSTUVWX12Z3jklmnopqrst4  !"#$%&'()*+,-./0123, /0.')(*+ %$#"!, -&2131B[\]^_Cba`c deEfFGHIJihg   %$#"!&'()*+NO,-./0RSTUVWX12Z3jklmnopqrstu      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYFGZ[\]^_`abcdefghDijklmno  pIqrstuvwxyz{|}~SimpleLog-0.1.0.3System.Log.SLog.FormatSystem.Log.SLogFormat FormatElem ThreadElem DateTimeElem StringElem SeverityElem MessageElemformatFlushKeySLogSLogT LogConfig ansiColoursloggersLogLine logSeverity logMessage logTimestamp logThreadFilterLogger TChanLogger StderrLogger StdoutLogger FileLoggerSyncAsync MonadSLoglogSeverityERRORWARNINGSUCCESSINFODEBUGdefaultLogFormatlogDlogSlogIlogWlogEanySevdefaultLogConfig waitFlushrunSLogT simpleLog formatLineforkSLogunsafeUnliftSLogT FormatElemTHtemplate-haskellLanguage.Haskell.TH.SyntaxLiftfinaliseFormat formatParser elemParserdatetimeParsermatFormatTH ThreadElemTHDateTimeElemTH StringElemTHSeverityElemTH MessageElemTH $fLiftText InitState InitLoggerresourcet-1.1.3.3%Control.Monad.Trans.Resource.Internal ResourceTSLogEnv threadNameloggerInternals logColours logFormatLoggerInternal stm-2.4.4Control.Concurrent.STM.TChanTChandirectory-1.2.1.0System.DirectorycanonicalizePath text-1.2.0.4Data.Text.InternalTextsgrwithSgr MonadResourceForkableT-0.1.0.2Control.Concurrent.ForkableTfork initLoggers canonExist forkCleanUpaggregateLoggers asyncLoggerchsloggerghc-prim GHC.TypesBoolpadS fileInitMap stdoutInit stderrInit tchanInitBoth InitAsyncInitSyncunSLogTTChanLoggerInternalAsyncLoggerInternalSyncLoggerInternal$fMonadSLogSLogT$fForkableSLogTSLogT$fSemigroupInitLogger$fMonadTransSLogT$fMonadBaseControlIOSLogT$fMonadTransControlSLogT$fMonadSLogResourceT$fMonadSLogContT$fMonadSLogErrorT$fMonadSLogReaderT$fMonadSLogStateT