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

159 lines
5.9 KiB
Markdown

11 years ago
# spdlog
Very fast, header only, C++ logging library. [![Build Status](https://travis-ci.org/gabime/spdlog.svg?branch=master)](https://travis-ci.org/gabime/spdlog)
11 years ago
## Install
10 years ago
Just copy the source [folder](https://github.com/gabime/spdlog/tree/master/include/spdlog) to your build tree and use a C++11 compiler
11 years ago
11 years ago
## Platforms
* Linux (gcc 4.8.1+, clang 3.5+)
10 years ago
* Windows (visual studio 2013+, cygwin/mingw with g++ 4.9.1+)
11 years ago
* Mac OSX (clang 3.5+)
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
* 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.
10 years ago
* [Custom](https://github.com/gabime/spdlog/wiki/3.-Custom-formatting) formatting.
11 years ago
* Multi/Single threaded loggers.
* Various log targets:
* Rotating log files.
* Daily log files.
10 years ago
* Console logging (including colors).
11 years ago
* 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
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
10 years ago
|threads|boost log 1.54|glog |easylogging |spdlog|
|-------|:-------:|:-----:|----------:|------:|
11 years ago
|1| 4.169s |1.066s |0.975s |0.302s|
10 years ago
|10| 6.180s |3.032s |2.857s |0.968s|
|100| 5.981s |1.139s |4.512s |0.497s|
#### 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
{
10 years ago
// console logger (multithreaded and with color)
auto console = spd::stdout_logger_mt("console", true);
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
//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
// 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
// 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
// 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
// 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
```
11 years ago
11 years ago
## Documentation
11 years ago
Documentation can be found in the [wiki](https://github.com/gabime/spdlog/wiki/1.-QuickStart) pages.