Awesome
co-log
co-log-core | |||
co-log | |||
co-log-polysemy |
co-log
is a composable and configurable logging framework. It
combines all the benefits of Haskell idioms to provide a reasonable
and convenient interface. Though it uses some advanced concepts in its
core, we are striving to provide beginner-friendly API. The library
also contains complete documentation with a lot of beginner-friendly
examples, explanations and tutorials to guide users. The combination
of a pragmatic approach to logging and fundamental Haskell abstractions
allows us to create a highly composable and configurable logging
framework.
If you're interested in how different Haskell typeclasses are used to
implement core functions of co-log
, you can read the following blog
post which goes into detail about internal implementation specifics:
co-log
is also modular on the level of packages. We care a lot about a
low dependency footprint so you can build your logging only on top of
the minimal required interface for your use-case. This repository contains
the following packages:
co-log-core
: lightweight package with basic data types and general idea which depends only onbase
.co-log
: taggless final implementation of logging library based onco-log-core
.co-log-polysemy
: implementation of logging library based onco-log-core
and thepolysemy
extensible effects library.co-log-benchmark
: benchmarks of theco-log
library.
To provide a more user-friendly introduction to the library, we've
created the tutorial series which introduces the main concepts behind co-log
smoothly:
co-log
also cares about concurrent logging. For this purpose we have the concurrent-playground
executable where we experiment with different multithreading scenarios to test the library's behavior.
You can find it here:
Benchmarks
co-log
is compared with basic functions like putStrLn
. Since IO overhead is
big enough, every benchmark dumps 10K messages to output. If a benchmark's name
doesn't contain Message
then this benchmark simply dumps the string "message"
to output, otherwise it works with the Message
data type from the co-log
library.
To run benchmarks, use the following command:
cabal v2-run co-log-bench
Benchmarks | Time for 10K messages |
---|---|
Prelude.putStrLn | 5.117ms |
Text.putStrLn | 9.220ms |
ByteString.putStrLn | 2.971ms |
mempty | 1.181ms |
logStringStdout | 5.107ms |
logPrint | 5.248ms |
logTextStdout | 5.351ms |
logByteStringStdout | 2.933ms |
logByteStringStderr | 17.482ms |
ByteString > (stdout <> stderr) | 17.715ms |
Message > format > stdout | 9.188ms |
Message > format > ByteString > stdout | 3.524ms |
Message{callstack} > format > stdout | 9.139ms |
Message{callstack:5} > format > stdout | 9.464ms |
Message{callstack:50} > format > stdout | 9.439ms |
Message{Time,ThreadId} > format > stdout | 54.160ms |
Message{Time,ThreadId} > format > ByteString > stdout | 54.137ms |