You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spdlog/README.md

158 lines
5.6 KiB
Markdown

11 years ago
# spdlog
11 years ago
Very fast, header only, C++ logging library.
11 years ago
## Install
Just copy the files to your build tree and use a C++11 compiler
## Tested on:
* gcc 4.8.1 and above
* clang 3.5
* visual studio 2013
11 years ago
* mingw with g++ 4.9.x
11 years ago
##Features
11 years ago
* Very fast - performance is the primary goal (see [benchmarks](#benchmarks) below).
11 years ago
* Headers only.
11 years ago
* No dependencies - just copy and use.
11 years ago
* Cross platform - Linux / Windows on 32/64 bits.
11 years ago
* **new!** Feature rich [call style](#usage-example) using the excellent [cppformat](http://cppformat.github.io/) library.
11 years ago
* ostream call style is supported too.
11 years ago
* Extremely fast asynchronous mode (optional) - using lockfree queues and other tricks to reach millions of calls/sec.
11 years ago
* [Custom](https://github.com/gabime/spdlog/wiki/Custom-formatting) formatting.
* Multi/Single threaded loggers.
* Various log targets:
* Rotating log files.
* Daily log files.
* Console logging.
* Linux syslog.
* Easily extendable with custom log targets (just implement a single function in the [sink](include/spdlog/sinks/sink.h) interface).
11 years ago
* Severity based filtering - threshold levels can be modified in runtime as well as in compile time.
11 years ago
11 years ago
## Benchmarks
11 years ago
11 years ago
Below are some [benchmarks](bench) comparing popular log libraries under Ubuntu 64 bit, Intel i7-4770 CPU @ 3.40GHz
11 years ago
11 years ago
#### Synchronous mode
11 years ago
Time needed to log 1,000,000 lines in synchronous mode (in seconds, the best of 3 runs):
11 years ago
|threads|boost log|glog |easylogging |spdlog|
|-------|:-------:|:-----:|----------:|------:|
11 years ago
|1| 4.169s |1.066s |0.975s |0.302s|
11 years ago
|10| 16.029 |3.032s |2.857s |0.968s|
11 years ago
|100| 15.008 |1.139s |4.512s |0.497s|
11 years ago
#### Asynchronous mode
11 years ago
Time needed to log 1,000,000 lines in asynchronous mode, i.e. the time it takes to put them in the async queue (in seconds, the best of 3 runs):
11 years ago
11 years ago
|threads|g2log <sup>async logger</sup> |spdlog <sup>async mode</sup>|
11 years ago
|:-------|:-----:|-------------------------:|
|1| 1.850s |0.216s |
|10| 0.943s |0.173s|
11 years ago
|100| 0.959s |0.202s|
11 years ago
11 years ago
11 years ago
## Usage Example
11 years ago
```c++
11 years ago
#include <iostream>
#include "spdlog/spdlog.h"
int main(int, char* [])
{
namespace spd = spdlog;
try
{
11 years ago
//Create console, multithreaded logger
auto console = spd::stdout_logger_mt("console");
11 years ago
console->info("Welcome to spdlog!") ;
11 years ago
console->info("An info message example {}..", 1);
console->info() << "Streams are supported too " << 1;
11 years ago
11 years ago
//Formatting examples
11 years ago
console->info("Easy padding in numbers like {:08d}", 12);
11 years ago
console->info("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
11 years ago
console->info("Support for floats {:03.2f}", 1.23456);
console->info("Positional args are {1} {0}..", "too", "supported");
11 years ago
console->info("{:<30}", "left aligned");
console->info("{:>30}", "right aligned");
console->info("{:^30}", "centered");
11 years ago
//
// Runtime log levels
11 years ago
//
11 years ago
spd::set_level(spd::level::info); //Set global log level to info
console->debug("This message shold not be displayed!");
11 years ago
console->set_level(spd::level::debug); // Set specific logger's log level
console->debug("Now it should..");
11 years ago
11 years ago
//
11 years ago
// Create a file rotating logger with 5mb size max and 3 rotated files
11 years ago
//
11 years ago
auto file_logger = spd::rotating_logger_mt("file_logger", "logs/mylogfile", 1048576 * 5, 3);
11 years ago
for(int i = 0; i < 10; ++i)
file_logger->info("{} * {} equals {:>10}", i, i, i*i);
11 years ago
//
// Create a daily logger - a new file is created every day on 2:30am
//
auto daily_logger = spd::daily_logger_mt("daily_logger", "logs/daily", 2, 30);
11 years ago
//
11 years ago
// Customize msg format for all messages
11 years ago
//
11 years ago
spd::set_pattern("*** [%H:%M:%S %z] [thread %t] %v ***");
file_logger->info("This is another message with custom format");
spd::get("console")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name) function");
11 years ago
//
// Compile time debug or trace macros.
// Enabled #ifdef SPDLOG_DEBUG_ON or #ifdef SPDLOG_TRACE_ON
//
SPDLOG_TRACE(console, "Enabled only #ifdef SPDLOG_TRACE_ON..{} ,{}", 1, 3.23);
SPDLOG_DEBUG(console, "Enabled only #ifdef SPDLOG_DEBUG_ON.. {} ,{}", 1, 3.23);
11 years ago
11 years ago
//
11 years ago
// Asynchronous logging is very fast..
// Just call spdlog::set_async_mode(q_size) and all created loggers from now on will be asynchronous..
11 years ago
//
11 years ago
size_t q_size = 1048576; //queue size must be power of 2
spdlog::set_async_mode(q_size);
11 years ago
auto async_file= spd::daily_logger_st("async_file_logger", "logs/async_log.txt");
async_file->info() << "This is async log.." << "Should be very fast!";
11 years ago
//
11 years ago
// syslog example. linux only..
11 years ago
//
11 years ago
#ifdef __linux__
11 years ago
std::string ident = "spdlog-example";
auto syslog_logger = spd::syslog_logger("syslog", ident, LOG_PID);
syslog_logger->warn("This is warning that will end up in syslog. This is Linux only!");
11 years ago
#endif
11 years ago
}
catch (const spd::spdlog_ex& ex)
{
std::cout << "Log failed: " << ex.what() << std::endl;
}
}
// Example of user defined class with operator<<
class some_class {};
std::ostream& operator<<(std::ostream& os, const some_class& c) { return os << "some_class"; }
void custom_class_example()
{
some_class c;
spdlog::get("console")->info("custom class with operator<<: {}..", c);
spdlog::get("console")->info() << "custom class with operator<<: " << c << "..";
}
11 years ago
```