 
| 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 on- base.
- co-log: taggless final implementation of logging library based on- co-log-core.
- co-log-polysemy: implementation of logging library based on- co-log-coreand the- polysemyextensible effects library.
- co-log-benchmark: benchmarks of the- co-loglibrary.
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 |