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 |