Yet another logging library.

Related tags

Logging logging
Overview

Blackhole - eating your logs with pleasure

Build Status codecov

Blackhole is an attribute-based logger with strong focus on gaining maximum performance as possible for such kind of loggers.

Features

Attributes

Attributes is the core feature of Blackhole. Technically speaking it's a key-value pairs escorting every logging record.

For example we have HTTP/1.1 server which produces access logs like:

[::] - esafronov [10/Oct/2000:13:55:36 -0700] 'GET /porn.png HTTP/1.0' 200 2326 - SUCCESS

It can be splitted into indexes or attributes:

message:   SUCCESS
host:      [::]
user:      esafronov
timestamp: 10/Oct/2000:13:55:36 -0700
method:    GET
uri:       /porn.png
protocol:  HTTP/1.0
status:    200
elapsed:   2326

Blackhole allows to specify any number of attributes you want, providing an ability to work with them before of while you writing them into its final destination. For example, Elasticsearch.

Shared library

Despite the header-only dark past now Blackhole is developed as a shared library. Such a radical change of distributing process was chosen because of many reasons.

Mainly, header-only libraries have one big disadvantage: any code change may (or not) result in recompiling all its dependencies, otherwise having weird runtime errors with symbol loading race.

The other reason was the personal aim to reduce compile time, because it was fucking huge!

Of course, there are disadvantages, such as virtual function call cost and closed doors for inlining, but here my personal benchmark-driven development helped to avoid performance degradation.

Planning

  • Shared library.
  • Inline namespaces.
  • Optional compile-time inline messages transformation (C++14).
    • Compile-time placeholder type checking.
    • Compile-time placeholder spec checking (?).
  • Python-like formatting (no printf-like formatting support) both inline and result messages.
  • Attributes.
  • Scoped attributes.
  • Wrappers.
  • Custom verbosity.
  • Custom attributes formatting.
  • Optional asynchronous pipelining.
    • Queue with block on overload.
    • Queue with drop on overload (count dropped message).
    • The same but for handlers.
  • Formatters.
    • String by pattern.
      • Optional placeholders.
      • Configurable leftover placeholder.
    • JSON with tree reconstruction.
  • Sinks.
    • Colored terminal output.
    • Files.
    • Syslog.
    • Socket UDP.
    • Socket TCP.
      • Blocking.
      • Non blocking.
  • Scatter-gathered IO (?)
  • Logger builder.
  • Macro with line and filename attributes.
  • Initializer from JSON (filename, string).
  • Inflector.
  • Filter category.
    • Category type.
    • For sinks.
    • For handlers.
    • For loggers.

Experimental

Note, that there are some symbols, that are wrapped into experimental namespace. These symbols don't adhere semantic versioning and, well... experimental. Use them with caution and only, where you want to try super-unstable features, which can be changed or even dropped.

Formatters

Formatters in Blackhole are responsible for converting every log record passing into some byte array representation. It can be either human-readable string, JSON tree or even protobuf packed frame.

String

String formatter provides an ability to configure your logging output using pattern mechanics with powerful customization support.

Unlike previous Blackhole versions now string formatter uses python-like syntax for describing patterns with using {} placeholders and format specifications inside. Moreover now you can specify timestamp specification directly inside the general pattern or even format it as a microseconds number since epoch.

For example we have the given pattern:

[{severity:>7}] [{timestamp:{%Y-%m-%d %H:%M:%S.%f}s}] {scope}: {message}

After applying some log events we expect to receive something like this:

[  DEBUG] [2015-11-19 19:02:30.836222] accept: HTTP/1.1 GET - / - 200, 4238
[   INFO] [2015-11-19 19:02:32.106331] config: server has reload its config in 200 ms
[WARNING] [2015-11-19 19:03:12.176262] accept: HTTP/1.1 GET - /info - 404, 829
[  ERROR] [2015-11-19 19:03:12.002127] accept: HTTP/1.1 GET - /info - 503, 829

As you may notice the severity field is aligned to the right border (see that >7 spec in pattern), the timestamp is formatted using default representation with a microseconds extension and so on. Because Blackhole is all about attributes you can place and format every custom attribute you want, as we just done with scope attribute.

The Blackhole supports several predefined attributes, with convenient specifications:

Placeholder Description
{severity:s} User provided severity string representation
{severity}, {severity:d} Numeric severity value
{timestamp:d} Number of microseconds since Unix epoch
{timestamp:{spec}s} String representation using strftime specification in UTC
{timestamp:{spec}l} String representation using strftime specification in local timezone
{timestamp}, {timestamp:s} The same as {timestamp:{%Y-%m-%d %H:%M:%S.%f}s}
{process:s} Process name
{process}, {process:d} PID
{thread}, {thread::x} Thread hex id as an opaque value returned by pthread_self(3)
{thread:s} Thread name or unnamed
{message} Logging message
{...} All user declared attributes

For more information please read the documentation and visit the following links:

Note, that if you need to include a brace character in the literal text, it can be escaped by doubling: {{ and }}.

There is a special attribute placeholder - {...} - which means to print all non-reserved attributes in a reverse order they were provided in a key-value manner separated by a comma. These kind of attributes can be configured using special syntax, similar with the timestamp attribute with an optional separator.

For example the following placeholder {...:{{name}={value}:p}{\t:x}s} results in tab separated key-value pairs like id=42\tmethod=GET.

For pedants there is a full placeholder grammar in EBNF:

Grammar     = Ph
            | OptPh
            | VarPh
Ph          = "{" Name "}"
OptPh       = "{" Name ":" Spec? "}"
VarPh       = "{...}"
            | "{...:" Ext? s "}"
Ext         = Pat
            | Sep
            | Pat Sep
            | Sep Pat
Name        = [a-zA-Z0-9_]
Spec        = Fill? Align? Width? Type
Fill        = [a character other than '{' or '}']
Align       = [>^<]
Width       = [1-9][0-9]*
Type        = [su]
Pat         = "{" PatSpec ":p}"
Sep         = "{" SepLit* ":s}" ("}" SepLit* ":s}")*
SepLit      = . ! (":s" | "}" | "}}" | "{" | "{{")
            | LeBrace
            | RiBrace
LeBrace     = "{{" -> "{"
RiBrace     = "}}" -> "}"
PatSpec     = (AtName | AtValue | PatLit)*
AtName      = "{name}"
            | AtNameSpec
AtNameSpec  = "{name:" AtSpec "}"
AtSpec      = Align? Width? AtType
AtType      = [sd]
AtValue     = "{value}"
            | AtValueSpec
AtValueSpec = "{value:" AtSpec "}"
PatLit      = . ! ("}" | "}}" | "{" | "{{")
            | LeBrace
            | RiBrace

Let's describe it more precisely. Given a complex leftover placeholder, let's parse it manually to see what Blackhole see. Given: {...:{{name}={value}:p}{\t:s}>50s}.

Parameter Description
... Reserved placeholder name indicating for Blackhole that this is a leftover placeholder.
: Optional spec marker that is placed after placeholder name where you want to apply one of several extensions. There are pattern, separator, prefix, suffix and format extensions. All of them except format should be surrounded in curly braces.
{{name}={value}:p} Pattern extension that describes how each attribute should be formatted using typical Blackhole notation. The suffix :p, that is required for extension identification, means pattern. Inside this pattern you can write any pattern you like using two available sub-placeholders for attribute name and value, for each of them a format spec can be applied using cppformat grammar. At last a format spec can be also applied to the entire placeholder, i.e. :>50p for example.
{\t:s} Separator extension for configuring each key-value pair separation. Nuff said.
{[:r} (Not implemented yet). Prefix extension that is prepended before entire result if it is not empty.
{]:u} (Not implemented yet). Suffix extension that is appended after entire result if it is not empty.

50s | Entire result format. See cppformat rules for specification.

JSON.

JSON formatter provides an ability to format a logging record into a structured JSON tree with attribute handling features, like renaming, routing, mutating and much more.

Briefly using JSON formatter allows to build fully dynamic JSON trees for its further processing with various external tools, like logstash or rsyslog lefting it, however, in a human-readable manner.

Blackhole allows you to control of JSON tree building process using several predefined options.

Without options it will produce just a plain tree with zero level depth. For example for a log record with a severity of 3, message "fatal error, please try again" and a pair of attributes {"key": 42, "ip": "[::]"} the result string will look like:

{
    "message": "fatal error, please try again",
    "severity": 3,
    "timestamp": 1449859055,
    "process": 12345,
    "thread": 57005,
    "key": 42,
    "ip": "[::]"
}

Using configuration parameters for this formatter you can:

Attributes renaming acts so much transparently as it appears: it just renames the given attribute name using the specified alternative.

Attributes routing specifies a location where the listed attributes will be placed at the tree construction. Also, you can specify a default location for all attributes, which is "/" meaning root otherwise.

For example with routing {"/fields": ["message", "severity"]} and "/" as a default pointer the mentioned JSON will look like:

{
    "fields": {
        "message": "fatal error, please try again",
        "severity": 3
    },
    "timestamp": 1449859055,
    "process": 12345,
    "thread": 57005,
    "key": 42,
    "ip": "[::]"
}

Attribute renaming occurs after routing, so mapping "message" => "#message" just replaces the old name with its new alternative.

To gain maximum speed at the tree construction no filtering occurs, so this formatter by default allows duplicated keys, which means invalid JSON tree (but most of parsers are fine with it). If you are really required to deal with unique keys, you can enable unique option, but it involves heap allocation and may slow down formatting.

Also, formatter allows to automatically append a newline character at the end of the tree, which is strangely required by some consumers, like logstash.

Note, that JSON formatter formats the tree using compact style without excess spaces, tabs etc.

For convenient formatter construction a special builder class is implemented allowing to create and configure instances of this class using streaming API. For example:

auto formatter = blackhole::formatter::json_t::builder_t()
    .route("/fields", {"message", "severity", "timestamp"})
    .route("/other")
    .rename("message", "#message")
    .rename("timestamp", "#timestamp")
    .newline()
    .unique()
    .build();

This allows to avoid hundreds of constructors and to make a formatter creation to look eye-candy.

The full table of options:

Option Type Description
/route Object of:
[string]
"*"
Allows to configure nested tree mapping. Each key must satisfy JSON Pointer specification and sets new attributes location in the tree. Values must be either an array of string, meaning list of attributes that are configured with new place or an "*" literal, meaning all other attributes.
/mapping Object of: [string] Simple attribute names renaming from key to value.
/newline bool If true, a newline will be appended to the end of the result message. The default is false.
/unique bool If true removes all backward consecutive duplicate elements from the attribute list range. For example, if there are two attributes with name "name" and values "v1" and "v2" inserted, then after filtering there will be only the last inserted, i.e. "v2". The default is false.
/mutate/timestamp string Replaces the timestamp field with new value by transforming it with the given strftime pattern.
/mutate/severity [string] Replaces the severity field with the string value at the current severity value.

For example:

"formatter": {
    "type": "json",
    "newline": true,
    "unique": true,
    "mapping": {
        "message": "@message",
        "timestamp": "@timestamp"
    },
    "routing": {
        "": ["message", "timestamp"],
        "/fields": "*"
    },
    "mutate": {
        "timestamp": "%Y-%m-%dT%H:%M:%S.%fZ",
        "severity": ["D", "I", "W", "E"]
    }
}

Sinks

Null

Sometimes we need to just drop all logging events no matter what, for example to benchmarking purposes. For these cases, there is null output (or sink), which just ignores all records.

The common configuration for this sink looks like:

"sinks": [
    {
        "type": "null"
    }
]

Console

Represents a console sink which is responsible for writing all incoming log events directly into the terminal using one of the selected standard outputs with an ability to optionally colorize result strings.

The sink automatically detects whether the destination stream is a TTY disabling colored output otherwise, which makes possible to redirect standard output to file without escaping codes garbage.

Note, that despite of C++ std::cout and std::cerr thread-safety with no undefined behavior its guarantees is insufficiently for safe working with them from multiple threads, leading to result messages intermixing. To avoid this a global mutex is used internally, which is kinda hack. Any other stdout/stderr usage outside from logger will probably results in character mixing, but no undefined behavior will be invoked.

The configuration:

"sinks": [
    {
        "type": "console"
    }
]

Note, that currently coloring cannot be configured through dynamic factory (i.e through JSON, YAML etc.), but can be through the builder.

enum severity {
    debug = 0,
    info,
    warn,
    error
};

auto console = blackhole::builder<blackhole::sink::console_t>()
    .colorize(severity::debug, blackhole::termcolor_t())
    .colorize(severity::info, blackhole::termcolor_t::blue())
    .colorize(severity::warn, blackhole::termcolor_t::yellow())
    .colorize(severity::error, blackhole::termcolor_t::red())
    .stdout()
    .build();

File

Represents a sink that writes formatted log events to the file or files located at the specified path.

The path can contain attribute placeholders, meaning that the real destination name will be deduced at runtime using provided log record (not ready yet). No real file will be opened at construction time. All files are opened by default in append mode meaning seek to the end of stream immediately after open.

This sink supports custom flushing policies, allowing to control hardware write load. There are three implemented policies right now:

  • Fully automatic (without configuration), meaning that the sink will decide whether to flush or not after each record consumed.
  • Count of records written - this is the simple counter with meaning of "flush at least every N records consumed", but the underlying implementation can decide to do it more often. The value of 1 means that the sink will flush after every logging event, but this results in dramatically performance degradation.
  • By counting of number of bytes written - Blackhole knows about bytes, megabytes, even mibibytes etc.

Note, that it's guaranteed that the sink always flush its buffers at destruction time. This guarantee with conjunction of thread-safe logger reassignment allows to implement common SIGHUP files reopening during log rotation.

Blackhole won't create intermediate directories, because of potential troubles with ACL. Instead an exception will be thrown, which will be anyway caught by the internal logging system notifying through stdout about it.

Note, that associated files will be opened on demand during the first write operation.

"sinks": [
    {
        "type": "file",
        "flush": "10MB",
        "path": "/var/log/blackhole.log"
    }
]

Blackhole knows about the following marginal binary units:

  • Bytes (B).
  • Kilobytes (kB).
  • Megabytes (MB).
  • Gigabytes (GB).
  • Kibibytes (KiB).
  • Mibibytes (MiB).
  • Gibibytes (GiB).

More you can read at https://en.wikipedia.org/wiki/Binary_prefix.

Socket

The socket sinks category contains sinks that write their output to a remote destination specified by a host and port. Currently the data can be sent over either TCP or UDP.

TCP

This appender emits formatted logging events using connected TCP socket.

Option Type Description
host string Required.
The name or address of the system that is listening for log events.
port u16 Required.
The port on the host that is listening for log events.

UDP

Nuff said.

Syslog

Option Type Description
priorities [i16] Required.
Priority mapping from severity number.

Configuration

Blackhole can be configured mainly in two ways:

  • Using experimental builder.
  • Using abstract factory (GoF, yeah).

Builder

The first way involves using experimental yet builder. For each library component (formatter, sink, etc.) there should be appropriate builder specialization that is used to create instances of associated component in a flow-way.

For example:

// Here we are going to configure our string/console handler and to build the logger.
auto log = blackhole::experimental::partial_builder<blackhole::root_logger_t>()
   // Add the blocking handler.
   .handler<blackhole::handler::blocking_t>()
       // Configure string formatter.
       //
       // Pattern syntax behaves like as usual substitution for placeholder. For example if
       // the attribute named `severity` has value `2`, then pattern `{severity}` will invoke
       // severity mapping function provided and the result will be `W`.
       .set<blackhole::formatter::string_t>("{severity}, [{timestamp}]: {message}")
           .mapping(&sevmap)
           .build()
       // Configure console sink to write into stdout (also stderr can be configured).
       .add<blackhole::sink::console_t>()
           .build()
       // And build the handler. Multiple handlers can be added to a single logger, but right
       // now we confine ourselves with a single handler.
       .build()
   // Build the logger.
   .build();

The result is a std::unique_ptr<C> where C: Component, sorry for my Rust.

This is also called static initialization, because you must know the configuration of your logging system at compile time. If this isn't suit for you there is another way.

Factory

Also called as dynamic initialization, and is the recommended way to configure the Blackhole, because it implements some kind of dependency injection through some external source, like JSON file, XML, or folly::dynamic.

Blackhole for now implements only initialization from JSON, but it can be easily extended as a plugin, because all you need is just to implement proper interface to allow tree-like traversing through your config object.

Here there is an example how to configure the library from JSON file.

// Here we are going to build the logger using registry. The registry's responsibility is to
// track registered handlers, formatter and sinks, but for now we're not going to register
// anything else, since there are predefined types.
auto log = blackhole::registry::configured()
    // Specify the concrete builder type we want to use. It may be JSON, XML, YAML or whatever
    // else.
    ->builder<blackhole::config::json_t>(std::ifstream(argv[1]))
        // Build the logger named "root".
        .build("root");

The result is a std::unique_ptr<logger_t> object.

For more information see blackhole::registry_t class and the include/blackhole/config where all magic happens. If you look for an example how to implement your own factory, please see src/config directory.

Facade

One can say that the raw logger interface is inconvenient, and this is true, unfortunately, because it must work both in simple cases, where intermediate message formatting is not required, without attributes; and in complex cases, where lazy message formatting occurs, with attributes provided, remaining at the same time as fast as possible, giving a high-performance solution.

Let's take a look on the interface:

class logger_t {
public:
    virtual ~logger_t() = 0;
    virtual auto log(severity_t severity, const message_t& message) -> void = 0;
    virtual auto log(severity_t severity, const message_t& message, attribute_pack& pack) -> void = 0;
    virtual auto log(severity_t severity, const lazy_message_t& message, attribute_pack& pack) -> void = 0;

    virtual auto manager() -> scope::manager_t& = 0;
};

To avoid manually creating all these structures a special extension is provided: facade. In two words it is a thin template adapter over any given logger which extends its interface, providing methods that makes logging convenient again. We describe all these methods by abusing a random HTTP logging event of success file serve.

For simple cases, there is a thin wrapper that transforms a string into string view and passes it further.

logger.log(0, "GET /static/image.png HTTP/1.1 436 200");

Sometimes we want to provide additional attributes. In these cases, they can be passed using initializer list.

logger.log(0, "GET /static/image.png HTTP/1.1 436 200", {
    {"cache", true},
    {"elapsed", 435.72},
    {"user-agent", "Mozilla Firefox"}
});

Often we want to format a message using predefined pattern, but with arguments obtained at runtime.

logger.log(0, "{} {} HTTP/1.1 {} {}", "GET", "/static/image.png", 436, 200);

At last, we can combine two previous examples to obtain something really useful. Note that attribute list argument must be the last.

logger.log(0, "{} {} HTTP/1.1 {} {}", "GET", "/static/image.png", 436, 200, attribute_list{
    {"cache", true},
    {"elapsed", 435.72},
    {"user-agent", "Mozilla Firefox"}
});

To use it all you need is to create a logger, import the facade definition and wrap the logger with it. We show you an improved example:

/// This example demonstrates how to initialize Blackhole from configuration file using JSON
/// builder.
/// In this case the entire logging pipeline is initialized from file including severity mapping.
/// The logging facade is used to allow runtime formatting and attributes provisioning.

#include <fstream>
#include <iostream>

#include <blackhole/attribute.hpp>
#include <blackhole/attributes.hpp>
#include <blackhole/config/json.hpp>
#include <blackhole/extensions/facade.hpp>
#include <blackhole/extensions/writer.hpp>
#include <blackhole/registry.hpp>
#include <blackhole/root.hpp>

using namespace blackhole;

/// As always specify severity enumeration.
enum severity {
    debug   = 0,
    info    = 1,
    warning = 2,
    error   = 3
};

auto main(int argc, char** argv) -> int {
    if (argc != 2) {
        std::cerr << "Usage: 3.config PATH" << std::endl;
        return 1;
    }

    /// Here we are going to build the logger using registry. The registry's responsibility is to
    /// track registered handlers, formatter and sinks, but for now we're not going to register
    /// anything else, since there are predefined types.
    auto inner = blackhole::registry::configured()
        /// Specify the concrete builder type we want to use. It may be JSON, XML, YAML or whatever
        /// else.
        ->builder<blackhole::config::json_t>(std::ifstream(argv[1]))
            /// Build the logger named "root".
            .build("root");

    /// Wrap the logger with facade to obtain an ability to format messages and provide attributes.
    auto log = blackhole::logger_facade<blackhole::root_logger_t>(inner);

    log.log(severity::debug, "{} {} HTTP/1.1 {} {}", "GET", "/static/image.png", 404, 347);
    log.log(severity::info, "nginx/1.6 configured", {
        {"elapsed", 32.5}
    });
    log.log(severity::warning, "client stopped connection before send body completed");
    log.log(severity::error, "file does not exist: {}", "/var/www/favicon.ico", blackhole::attribute_list{
        {"Cache", true},
        {"Cache-Duration", 10},
        {"User-Agent", "Mozilla Firefox"}
    });

    return 0;
}

Runtime Type Information

The library can be successfully compiled and used without RTTI (with -fno-rtti flag).

Possible bottlenecks

  • Timestamp formatting
  • Using system clock - can be replaces with OS specific clocks.
  • Using gmtime - manual std::tm generation without mutex shit.
  • Temporary buffer - affects, but not so much.

Why another logging library?

That's the first question I ask myself when seeing yet another silver-bullet library.

First of all, we required a logger with attributes support. Here boost::log was fine, but it didn't compile in our compilers. Sad. After that we've realized that one of our bottlenecks is located in logging part, that's why boost::log and log4cxx weren't fit in our requirements. Thirdly we are developing for stable, but old linux distributives with relatively old compilers that supports only basic part of C++11.

At last, but not least, all that libraries have one fatal disadvantage - NIH.

So here we are.

To be honest, let's describe some popular logging libraries, its advantages and disadvantages as one of them may fit your requirements and you may want to use them instead. It's okay.

Boost.LogV2

Developed by another crazy Russian programmer using dark template magic and Vodka (not sure what was first). It's a perfect and powerful library, seriously.

Pros:

  • It's a fucking boost! Many people don't want to depend on another library, wishing to just apt-get install instead.
  • Have attributes too.
  • Large community, fewer bugs.
  • Highly configurable.
  • Good documentation.

Cons:

  • Sadly, but you are restricted with the latest boost versions.
  • Hard to hack and extend unless you are fine with templates, template of templates and variadic templates of a templated templates with templates. Or you are Andrei Alexandrescu.
  • Relatively poor performance. Higher than log4cxx have, but not enough for us.
  • Requires RTTI.

Log4cxx

Logging framework for C++ patterned after Apache log4j. Yeah, Java.

Pros:

  • Absolutely zero barrier to entry. Really, you just copy-paste the code from tutorial and it works. Amazing!

Cons:

  • Leaking.
  • APR.
  • Have no attributes.
  • Really slow performance.
  • Seems like it's not really supported now.

Spdlog

Extremely ultra bloody fucking fast logging library. At least the documentation says that. Faster than speed of light!

But everyone knows that even the light is unable to leave from blackhole.

Pros:

  • Really fast, I checked.
  • Header only. Not sure it's an advantage, but for small projects it's fine.
  • Easy to extend, because the code itself is plain, straightforward and magically easy to understand.
  • No dependencies.
  • Nice kitty in author's avatar.

Cons:

  • Again no attributes, no custom filtering, no custom verbosity levels. You are restricted to the functionality provided by this library, nothing more.

Notable changes

First of all, the entire library was completely rewritten for performance reasons.

  • No more attribute copying unless it's really required (for asynchronous logging for example). Nested attributes are now organized in flattened range.
  • Dropped boost::format into the Hell. It's hard to find a slower library for formatting both in compilation stage and runtime. Instead, the perfect cppformat library with an own compile-time constexpr extensions is used.
  • There are predefined attributes with fast read access, like message, severity, timestmap etc.
  • With cppformat participation there is new Python-like format syntax using placeholder replacement.
  • Severity mapping from its numeric representation to strings can now be configured from generic configuration source (from file for example).
  • ...

Requirements

  • C++11/14/17 compiler (yep, using C++17 opens additional functionalities).
  • Boost.Thread - for TLS.

Development

Git workflow

Each feature and fix is developed in a separate branch. Bugs which are discovered during development of a certain feature, may be fixed in the same branch as their parent issue. This is also true for small features.

Branch structure:

  • master: master branch - contains a stable, working version of VM code.
  • develop: development branch - all fixes and features are first merged here.
  • issue/<number>/<slug> or issue/<slug>: for issues (both enhancement and bug fixes).
Comments
  • files sink doesn't always rotate logs

    files sink doesn't always rotate logs

    We frequently see this issue in elliptics:

    # ls -l /proc/19808/fd/ | grep log l-wx------ 1 root root 64 Jul 28 01:49 3 -> /home/admin/elliptics/log/ioserv.log-2015.07.22-1437535502 (deleted)

    ioserv.log - elliptics log file - was moved by logrotate 6 days ago, but blackhole didn't notice that and didn't reopen logfile. Here is appropriate config section:

            "logger": {
                    "frontends": [
                            {
                                    "formatter": {
                                            "type": "string",
                                            "pattern": "%(timestamp)s %(request_id)s/%(lwp)s/%(pid)s %(severity)s: %(message)s %(...L)s"
                                    },
                                    "sink": {
                                            "type": "files",
                                            "path": "/home/admin/elliptics/log/ioserv.log",
                                            "autoflush": true,
                                            "rotation": {
                                                    "move": 0
                                            }
                                    }
                            }
                    ],
                    "level": "info"
            },
    

    We use blackhole 0.2 if that matters. Rotation changed a little bit - there were introduced additional checks which might explain why 'size' rotation doesn't work in 0.2, but common 'move' logic is the same afaics.

    It doesn't happen all the time, but yet quite frequently.

    opened by bioothod 28
  • Could not complile under FreeBSD 10.3, Clang 3.6.2 and 3.8.0: boost error is

    Could not complile under FreeBSD 10.3, Clang 3.6.2 and 3.8.0: boost error is "call to 'f' is ambiguous"

    FreeBSD 10.3, Clang 3.6.2 FreeBSD 10.3, Clang 3.8.0

    Detail log:

    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:1:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/attribute.hpp:8:
    In file included from /usr/local/include/boost/mpl/contains.hpp:19:
    In file included from /usr/local/include/boost/mpl/sequence_tag.hpp:18:
    In file included from /usr/local/include/boost/mpl/aux_/has_tag.hpp:17:
    In file included from /usr/local/include/boost/mpl/has_xxx.hpp:19:
    In file included from /usr/local/include/boost/mpl/bool.hpp:17:
    In file included from /usr/local/include/boost/mpl/bool_fwd.hpp:17:
    In file included from /usr/local/include/boost/mpl/aux_/adl_barrier.hpp:17:
    In file included from /usr/local/include/boost/mpl/aux_/config/adl.hpp:20:
    In file included from /usr/local/include/boost/mpl/aux_/config/workaround.hpp:17:
    /usr/local/include/boost/detail/workaround.hpp:44:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __BORLANDC___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:49:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __CODEGEARC___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:54:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define _MSC_VER_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:59:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define _MSC_FULL_VER_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:76:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __GNUC___WORKAROUND_GUARD 0
            ^
    /usr/local/include/boost/detail/workaround.hpp:81:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __GNUC_MINOR___WORKAROUND_GUARD 0
            ^
    /usr/local/include/boost/detail/workaround.hpp:86:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 0
            ^
    /usr/local/include/boost/detail/workaround.hpp:89:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __IBMCPP___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:94:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __SUNPRO_CC_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:99:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __DECCXX_VER_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:104:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __MWERKS___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:109:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __EDG___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:114:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __EDG_VERSION___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:119:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __HP_aCC_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:124:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __hpxstd98_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:129:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define _CRAYC_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:134:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __DMC___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:144:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __COMO___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:149:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __COMO_VERSION___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:154:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __INTEL_COMPILER_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:159:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __ICL_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:164:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define _COMPILER_VERSION_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:170:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define _RWSTD_VER_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:180:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __GLIBCPP___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:185:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:190:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __SGI_STL_PORT_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:195:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define _STLPORT_VERSION_WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:200:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define __LIBCOMO_VERSION___WORKAROUND_GUARD 1
            ^
    /usr/local/include/boost/detail/workaround.hpp:205:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define _CPPLIB_VER_WORKAROUND_GUARD 1
            ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:1:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/attribute.hpp:8:
    In file included from /usr/local/include/boost/mpl/contains.hpp:20:
    In file included from /usr/local/include/boost/mpl/aux_/contains_impl.hpp:20:
    In file included from /usr/local/include/boost/mpl/find.hpp:17:
    In file included from /usr/local/include/boost/mpl/find_if.hpp:17:
    In file included from /usr/local/include/boost/mpl/aux_/find_if_pred.hpp:14:
    In file included from /usr/local/include/boost/mpl/aux_/iter_apply.hpp:17:
    In file included from /usr/local/include/boost/mpl/apply.hpp:24:
    In file included from /usr/local/include/boost/mpl/placeholders.hpp:24:
    In file included from /usr/local/include/boost/mpl/arg.hpp:37:
    In file included from /usr/local/include/boost/mpl/aux_/include_preprocessed.hpp:37:
    /usr/local/include/boost/mpl/aux_/preprocessed/gcc/arg.hpp:27:9: warning: use of old-style cast [-Wold-style-cast]
            BOOST_MPL_AUX_ASSERT_NOT_NA(type);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/aux_/na_assert.hpp:25:5: note: expanded from macro 'BOOST_MPL_AUX_ASSERT_NOT_NA'
        BOOST_MPL_ASSERT_NOT((boost::mpl::is_na<type>)) \
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/assert.hpp:312:43: note: expanded from macro 'BOOST_MPL_ASSERT_NOT'
                  boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \
                                              ^              ~
    /usr/local/include/boost/mpl/assert.hpp:59:58: note: expanded from macro '\
    BOOST_MPL_AUX_ASSERT_CONSTANT'
    #   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
                                                             ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:1:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/attribute.hpp:8:
    In file included from /usr/local/include/boost/mpl/contains.hpp:20:
    In file included from /usr/local/include/boost/mpl/aux_/contains_impl.hpp:20:
    In file included from /usr/local/include/boost/mpl/find.hpp:17:
    In file included from /usr/local/include/boost/mpl/find_if.hpp:17:
    In file included from /usr/local/include/boost/mpl/aux_/find_if_pred.hpp:14:
    In file included from /usr/local/include/boost/mpl/aux_/iter_apply.hpp:17:
    In file included from /usr/local/include/boost/mpl/apply.hpp:24:
    In file included from /usr/local/include/boost/mpl/placeholders.hpp:24:
    In file included from /usr/local/include/boost/mpl/arg.hpp:37:
    In file included from /usr/local/include/boost/mpl/aux_/include_preprocessed.hpp:37:
    /usr/local/include/boost/mpl/aux_/preprocessed/gcc/arg.hpp:45:9: warning: use of old-style cast [-Wold-style-cast]
            BOOST_MPL_AUX_ASSERT_NOT_NA(type);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/aux_/na_assert.hpp:25:5: note: expanded from macro 'BOOST_MPL_AUX_ASSERT_NOT_NA'
        BOOST_MPL_ASSERT_NOT((boost::mpl::is_na<type>)) \
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/assert.hpp:312:43: note: expanded from macro 'BOOST_MPL_ASSERT_NOT'
                  boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \
                                              ^              ~
    /usr/local/include/boost/mpl/assert.hpp:59:58: note: expanded from macro '\
    BOOST_MPL_AUX_ASSERT_CONSTANT'
    #   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
                                                             ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:1:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/attribute.hpp:8:
    In file included from /usr/local/include/boost/mpl/contains.hpp:20:
    In file included from /usr/local/include/boost/mpl/aux_/contains_impl.hpp:20:
    In file included from /usr/local/include/boost/mpl/find.hpp:17:
    In file included from /usr/local/include/boost/mpl/find_if.hpp:17:
    In file included from /usr/local/include/boost/mpl/aux_/find_if_pred.hpp:14:
    In file included from /usr/local/include/boost/mpl/aux_/iter_apply.hpp:17:
    In file included from /usr/local/include/boost/mpl/apply.hpp:24:
    In file included from /usr/local/include/boost/mpl/placeholders.hpp:24:
    In file included from /usr/local/include/boost/mpl/arg.hpp:37:
    In file included from /usr/local/include/boost/mpl/aux_/include_preprocessed.hpp:37:
    /usr/local/include/boost/mpl/aux_/preprocessed/gcc/arg.hpp:63:9: warning: use of old-style cast [-Wold-style-cast]
            BOOST_MPL_AUX_ASSERT_NOT_NA(type);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/aux_/na_assert.hpp:25:5: note: expanded from macro 'BOOST_MPL_AUX_ASSERT_NOT_NA'
        BOOST_MPL_ASSERT_NOT((boost::mpl::is_na<type>)) \
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/assert.hpp:312:43: note: expanded from macro 'BOOST_MPL_ASSERT_NOT'
                  boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \
                                              ^              ~
    /usr/local/include/boost/mpl/assert.hpp:59:58: note: expanded from macro '\
    BOOST_MPL_AUX_ASSERT_CONSTANT'
    #   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
                                                             ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:1:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/attribute.hpp:8:
    In file included from /usr/local/include/boost/mpl/contains.hpp:20:
    In file included from /usr/local/include/boost/mpl/aux_/contains_impl.hpp:20:
    In file included from /usr/local/include/boost/mpl/find.hpp:17:
    In file included from /usr/local/include/boost/mpl/find_if.hpp:17:
    In file included from /usr/local/include/boost/mpl/aux_/find_if_pred.hpp:14:
    In file included from /usr/local/include/boost/mpl/aux_/iter_apply.hpp:17:
    In file included from /usr/local/include/boost/mpl/apply.hpp:24:
    In file included from /usr/local/include/boost/mpl/placeholders.hpp:24:
    In file included from /usr/local/include/boost/mpl/arg.hpp:37:
    In file included from /usr/local/include/boost/mpl/aux_/include_preprocessed.hpp:37:
    /usr/local/include/boost/mpl/aux_/preprocessed/gcc/arg.hpp:81:9: warning: use of old-style cast [-Wold-style-cast]
            BOOST_MPL_AUX_ASSERT_NOT_NA(type);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/aux_/na_assert.hpp:25:5: note: expanded from macro 'BOOST_MPL_AUX_ASSERT_NOT_NA'
        BOOST_MPL_ASSERT_NOT((boost::mpl::is_na<type>)) \
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/assert.hpp:312:43: note: expanded from macro 'BOOST_MPL_ASSERT_NOT'
                  boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \
                                              ^              ~
    /usr/local/include/boost/mpl/assert.hpp:59:58: note: expanded from macro '\
    BOOST_MPL_AUX_ASSERT_CONSTANT'
    #   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
                                                             ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:1:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/attribute.hpp:8:
    In file included from /usr/local/include/boost/mpl/contains.hpp:20:
    In file included from /usr/local/include/boost/mpl/aux_/contains_impl.hpp:20:
    In file included from /usr/local/include/boost/mpl/find.hpp:17:
    In file included from /usr/local/include/boost/mpl/find_if.hpp:17:
    In file included from /usr/local/include/boost/mpl/aux_/find_if_pred.hpp:14:
    In file included from /usr/local/include/boost/mpl/aux_/iter_apply.hpp:17:
    In file included from /usr/local/include/boost/mpl/apply.hpp:24:
    In file included from /usr/local/include/boost/mpl/placeholders.hpp:24:
    In file included from /usr/local/include/boost/mpl/arg.hpp:37:
    In file included from /usr/local/include/boost/mpl/aux_/include_preprocessed.hpp:37:
    /usr/local/include/boost/mpl/aux_/preprocessed/gcc/arg.hpp:99:9: warning: use of old-style cast [-Wold-style-cast]
            BOOST_MPL_AUX_ASSERT_NOT_NA(type);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/aux_/na_assert.hpp:25:5: note: expanded from macro 'BOOST_MPL_AUX_ASSERT_NOT_NA'
        BOOST_MPL_ASSERT_NOT((boost::mpl::is_na<type>)) \
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/assert.hpp:312:43: note: expanded from macro 'BOOST_MPL_ASSERT_NOT'
                  boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \
                                              ^              ~
    /usr/local/include/boost/mpl/assert.hpp:59:58: note: expanded from macro '\
    BOOST_MPL_AUX_ASSERT_CONSTANT'
    #   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
                                                             ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:1:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/attribute.hpp:8:
    In file included from /usr/local/include/boost/mpl/contains.hpp:20:
    In file included from /usr/local/include/boost/mpl/aux_/contains_impl.hpp:20:
    In file included from /usr/local/include/boost/mpl/find.hpp:17:
    In file included from /usr/local/include/boost/mpl/find_if.hpp:17:
    In file included from /usr/local/include/boost/mpl/aux_/find_if_pred.hpp:14:
    In file included from /usr/local/include/boost/mpl/aux_/iter_apply.hpp:17:
    In file included from /usr/local/include/boost/mpl/apply.hpp:24:
    In file included from /usr/local/include/boost/mpl/placeholders.hpp:24:
    In file included from /usr/local/include/boost/mpl/arg.hpp:37:
    In file included from /usr/local/include/boost/mpl/aux_/include_preprocessed.hpp:37:
    /usr/local/include/boost/mpl/aux_/preprocessed/gcc/arg.hpp:117:9: warning: use of old-style cast [-Wold-style-cast]
            BOOST_MPL_AUX_ASSERT_NOT_NA(type);
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/aux_/na_assert.hpp:25:5: note: expanded from macro 'BOOST_MPL_AUX_ASSERT_NOT_NA'
        BOOST_MPL_ASSERT_NOT((boost::mpl::is_na<type>)) \
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/mpl/assert.hpp:312:43: note: expanded from macro 'BOOST_MPL_ASSERT_NOT'
                  boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \
                                              ^              ~
    /usr/local/include/boost/mpl/assert.hpp:59:58: note: expanded from macro '\
    BOOST_MPL_AUX_ASSERT_CONSTANT'
    #   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
                                                             ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:7:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/detail/attribute.hpp:3:
    In file included from /usr/local/include/boost/variant/variant.hpp:32:
    /usr/local/include/boost/variant/detail/forced_return.hpp:53:1: warning: function 'forced_return<void>' could be declared with attribute 'noreturn' [-Wmissing-noreturn]
    {
    ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:7:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/detail/attribute.hpp:3:
    In file included from /usr/local/include/boost/variant/variant.hpp:33:
    In file included from /usr/local/include/boost/variant/detail/initializer.hpp:23:
    In file included from /usr/local/include/boost/variant/detail/move.hpp:27:
    In file included from /usr/local/include/boost/move/move.hpp:23:
    In file included from /usr/local/include/boost/move/traits.hpp:19:
    In file included from /usr/local/include/boost/type_traits/is_nothrow_move_constructible.hpp:21:
    In file included from /usr/local/include/boost/utility/declval.hpp:15:
    /usr/local/include/boost/type_traits/add_rvalue_reference.hpp:9:9: warning: macro name is a reserved identifier [-Wreserved-id-macro]
    #define BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP
            ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:5:
    In file included from /usr/local/include/boost/variant/get.hpp:21:
    /usr/local/include/boost/utility/addressof.hpp:59:12: error: call to 'f' is ambiguous
        return boost::detail::addressof_impl<T>::f( boost::detail::addr_impl_ref<T>( v ), 0 );
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/include/boost/variant/get.hpp:85:23: note: in instantiation of function template specialization 'boost::addressof<const nullptr_t>' requested here
            return boost::addressof(operand);
                          ^
    /usr/local/include/boost/variant/variant.hpp:1048:16: note: in instantiation of member function 'boost::detail::variant::get_visitor<const nullptr_t>::operator()' requested here
            return visitor_(operand);
                   ^
    /usr/local/include/boost/variant/detail/visitation_impl.hpp:128:20: note: in instantiation of function template specialization 'boost::detail::variant::invoke_visitor<boost::detail::variant::get_visitor<const nullptr_t> >::internal_visit<const nullptr_t>' requested here
        return visitor.internal_visit(
                       ^
    /usr/local/include/boost/variant/detail/visitation_impl.hpp:170:13: note: in instantiation of function template specialization 'boost::detail::variant::visitation_impl_invoke_impl<boost::detail::variant::invoke_visitor<boost::detail::variant::get_visitor<const nullptr_t> >, const void *, nullptr_t>' requested here
        return (visitation_impl_invoke_impl)(
                ^
    /usr/local/include/boost/variant/detail/visitation_impl.hpp:258:11: note: in instantiation of function template specialization 'boost::detail::variant::visitation_impl_invoke<boost::detail::variant::invoke_visitor<boost::detail::variant::get_visitor<const nullptr_t> >, const void *, nullptr_t, boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, std::__1::basic_string<char>, std::__1::function<void (blackhole::v1::writer_t &)>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::has_fallback_type_>' requested here
            , BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_CASE
              ^
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:38:60: note: expanded from macro 'BOOST_PP_REPEAT_1'
    # define BOOST_PP_REPEAT_1(c, m, d) BOOST_PP_REPEAT_1_I(c, m, d)
                                                               ^
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:43:63: note: expanded from macro 'BOOST_PP_REPEAT_1_I'
    # define BOOST_PP_REPEAT_1_I(c, m, d) BOOST_PP_REPEAT_1_ ## c(m, d)
                                                                  ^
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:71:58: note: expanded from macro 'BOOST_PP_REPEAT_1_20'
    # define BOOST_PP_REPEAT_1_20(m, d) BOOST_PP_REPEAT_1_19(m, d) m(2, 19, d)
                                                             ^
    note: (skipping 17 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:53:56: note: expanded from macro 'BOOST_PP_REPEAT_1_2'
    # define BOOST_PP_REPEAT_1_2(m, d) BOOST_PP_REPEAT_1_1(m, d) m(2, 1, d)
                                                           ^
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:52:36: note: expanded from macro 'BOOST_PP_REPEAT_1_1'
    # define BOOST_PP_REPEAT_1_1(m, d) m(2, 0, d)
                                       ^
    /usr/local/include/boost/variant/detail/visitation_impl.hpp:249:17: note: expanded from macro 'BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_CASE'
            return (visitation_impl_invoke)( \
                    ^
    /usr/local/include/boost/variant/variant.hpp:2362:33: note: in instantiation of function template specialization 'boost::detail::variant::visitation_impl<mpl_::int_<0>, boost::detail::variant::visitation_impl_step<boost::mpl::v_iter<boost::mpl::v_item<std::__1::function<void (blackhole::v1::writer_t &)>, boost::mpl::v_item<std::__1::basic_string<char>, boost::mpl::v_item<double, boost::mpl::v_item<unsigned long, boost::mpl::v_item<long, boost::mpl::v_item<bool, boost::mpl::v_item<nullptr_t, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, boost::mpl::v_iter<boost::mpl::v_item<std::__1::function<void (blackhole::v1::writer_t &)>, boost::mpl::v_item<std::__1::basic_string<char>, boost::mpl::v_item<double, boost::mpl::v_item<unsigned long, boost::mpl::v_item<long, boost::mpl::v_item<bool, boost::mpl::v_item<nullptr_t, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 7> >, boost::detail::variant::invoke_visitor<boost::detail::variant::get_visitor<const nullptr_t> >, const void *, boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, std::__1::basic_string<char>, std::__1::function<void (blackhole::v1::writer_t &)>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::has_fallback_type_>' requested here
            return detail::variant::visitation_impl(
                                    ^
    /usr/local/include/boost/variant/variant.hpp:2387:16: note: in instantiation of function template specialization 'boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, std::__1::basic_string<char>, std::__1::function<void (blackhole::v1::writer_t &)>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::internal_apply_visitor_impl<boost::detail::variant::invoke_visitor<boost::detail::variant::get_visitor<const nullptr_t> >, const void *>' requested here
            return internal_apply_visitor_impl(
                   ^
    /usr/local/include/boost/variant/variant.hpp:2411:22: note: in instantiation of function template specialization 'boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, std::__1::basic_string<char>, std::__1::function<void (blackhole::v1::writer_t &)>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::internal_apply_visitor<boost::detail::variant::invoke_visitor<boost::detail::variant::get_visitor<const nullptr_t> > >' requested here
            return this->internal_apply_visitor(invoker);
                         ^
    /usr/local/include/boost/variant/get.hpp:166:21: note: in instantiation of function template specialization 'boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, std::__1::basic_string<char>, std::__1::function<void (blackhole::v1::writer_t &)>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::apply_visitor<boost::detail::variant::get_visitor<const nullptr_t> >' requested here
        return operand->apply_visitor(v);
                        ^
    /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:156:30: note: in instantiation of function template specialization 'boost::get<nullptr_t, boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, std::__1::basic_string<char>, std::__1::function<void (blackhole::v1::writer_t &)>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>' requested here
        if (auto result = boost::get<T>(&value.inner().value)) {
                                 ^
    /usr/local/include/boost/utility/addressof.hpp:37:23: note: candidate function
        static inline T * f( T & v, long )
                          ^
    /usr/local/include/boost/utility/addressof.hpp:43:23: note: candidate function
        static inline T * f( T * v, int )
                          ^
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:7:
    In file included from /home/username/blackhole2/blackhole-1.0.0-0alpha8/include/blackhole/detail/attribute.hpp:3:
    /usr/local/include/boost/variant/variant.hpp:997:20: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
            return lhs == rhs;
                   ~~~ ^  ~~~
    /usr/local/include/boost/variant/variant.hpp:979:16: note: in instantiation of function template specialization 'boost::detail::variant::equal_comp::operator()<double>' requested here
            return Comp()(lhs_content, rhs_content);
                   ^
    /usr/local/include/boost/variant/variant.hpp:1048:16: note: in instantiation of function template specialization 'boost::detail::variant::comparer<boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, boost::detail::variant::equal_comp>::operator()<double>' requested here
            return visitor_(operand);
                   ^
    /usr/local/include/boost/variant/detail/visitation_impl.hpp:128:20: note: in instantiation of function template specialization 'boost::detail::variant::invoke_visitor<boost::detail::variant::comparer<boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, boost::detail::variant::equal_comp> >::internal_visit<const double>' requested here
        return visitor.internal_visit(
                       ^
    /usr/local/include/boost/variant/detail/visitation_impl.hpp:170:13: note: in instantiation of function template specialization 'boost::detail::variant::visitation_impl_invoke_impl<boost::detail::variant::invoke_visitor<boost::detail::variant::comparer<boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, boost::detail::variant::equal_comp> >, const void *, double>' requested here
        return (visitation_impl_invoke_impl)(
                ^
    /usr/local/include/boost/variant/detail/visitation_impl.hpp:258:11: note: in instantiation of function template specialization 'boost::detail::variant::visitation_impl_invoke<boost::detail::variant::invoke_visitor<boost::detail::variant::comparer<boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, boost::detail::variant::equal_comp> >, const void *, double, boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::has_fallback_type_>' requested here
            , BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_CASE
              ^
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:38:60: note: expanded from macro 'BOOST_PP_REPEAT_1'
    # define BOOST_PP_REPEAT_1(c, m, d) BOOST_PP_REPEAT_1_I(c, m, d)
                                                               ^
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:43:63: note: expanded from macro 'BOOST_PP_REPEAT_1_I'
    # define BOOST_PP_REPEAT_1_I(c, m, d) BOOST_PP_REPEAT_1_ ## c(m, d)
                                                                  ^
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:71:58: note: expanded from macro 'BOOST_PP_REPEAT_1_20'
    # define BOOST_PP_REPEAT_1_20(m, d) BOOST_PP_REPEAT_1_19(m, d) m(2, 19, d)
                                                             ^
    note: (skipping 13 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:57:56: note: expanded from macro 'BOOST_PP_REPEAT_1_6'
    # define BOOST_PP_REPEAT_1_6(m, d) BOOST_PP_REPEAT_1_5(m, d) m(2, 5, d)
                                                           ^
    /usr/local/include/boost/preprocessor/repetition/repeat.hpp:56:62: note: expanded from macro 'BOOST_PP_REPEAT_1_5'
    # define BOOST_PP_REPEAT_1_5(m, d) BOOST_PP_REPEAT_1_4(m, d) m(2, 4, d)
                                                                 ^
    /usr/local/include/boost/variant/detail/visitation_impl.hpp:249:17: note: expanded from macro 'BOOST_VARIANT_AUX_APPLY_VISITOR_STEP_CASE'
            return (visitation_impl_invoke)( \
                    ^
    /usr/local/include/boost/variant/variant.hpp:2362:33: note: in instantiation of function template specialization 'boost::detail::variant::visitation_impl<mpl_::int_<0>, boost::detail::variant::visitation_impl_step<boost::mpl::v_iter<boost::mpl::v_item<blackhole::v1::attribute::view_t::function_type, boost::mpl::v_item<blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, boost::mpl::v_item<double, boost::mpl::v_item<unsigned long, boost::mpl::v_item<long, boost::mpl::v_item<bool, boost::mpl::v_item<nullptr_t, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, boost::mpl::v_iter<boost::mpl::v_item<blackhole::v1::attribute::view_t::function_type, boost::mpl::v_item<blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, boost::mpl::v_item<double, boost::mpl::v_item<unsigned long, boost::mpl::v_item<long, boost::mpl::v_item<bool, boost::mpl::v_item<nullptr_t, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 0>, 0>, 0>, 7> >, boost::detail::variant::invoke_visitor<boost::detail::variant::comparer<boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, boost::detail::variant::equal_comp> >, const void *, boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::has_fallback_type_>' requested here
            return detail::variant::visitation_impl(
                                    ^
    /usr/local/include/boost/variant/variant.hpp:2387:16: note: in instantiation of function template specialization 'boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::internal_apply_visitor_impl<boost::detail::variant::invoke_visitor<boost::detail::variant::comparer<boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, boost::detail::variant::equal_comp> >, const void *>' requested here
            return internal_apply_visitor_impl(
                   ^
    /usr/local/include/boost/variant/variant.hpp:2411:22: note: in instantiation of function template specialization 'boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::internal_apply_visitor<boost::detail::variant::invoke_visitor<boost::detail::variant::comparer<boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, boost::detail::variant::equal_comp> > >' requested here
            return this->internal_apply_visitor(invoker);
                         ^
    /usr/local/include/boost/variant/variant.hpp:2310:20: note: in instantiation of function template specialization 'boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::apply_visitor<boost::detail::variant::comparer<boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>, boost::detail::variant::equal_comp> >' requested here
            return rhs.apply_visitor(visitor);
                       ^
    /home/username/blackhole2/blackhole-1.0.0-0alpha8/src/attribute.cpp:247:26: note: in instantiation of member function 'boost::variant<boost::detail::variant::over_sequence<boost::mpl::vector<nullptr_t, bool, long, unsigned long, double, blackhole::v1::cpp17::basic_string_view<char, std::__1::char_traits<char> >, blackhole::v1::attribute::view_t::function_type, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::operator==' requested here
        return inner().value == other.inner().value;
                             ^
    38 warnings and 1 error generated.
    
                     ^
    
    
    opened by abclogin 12
  • boost 1.58 compilation error

    boost 1.58 compilation error

    Hi

    boost::variant 1.58 has introduced static asserts which fail compilation this way. Here is code which calls blackhole::dynamic_t::to() which in turn invokes boost::get<T>(&value)

    typedef blackhole::dynamic_t dynamic_t;
    ...
    const dynamic_t m_value;
    m_value.to<const dynamic_t::array_t &>().size()
    
    In file included from /usr/include/boost/intrusive/detail/generic_hook.hpp:29:0,
                     from /usr/include/boost/intrusive/list_hook.hpp:23,
                     from /usr/include/boost/intrusive/list.hpp:20,
                     from /home/zbr/rpmbuild/BUILD/elliptics-2.26.9.2/cache/cache.hpp:33,
                     from /home/zbr/rpmbuild/BUILD/elliptics-2.26.9.2/cache/cache.cpp:18:
    /usr/include/boost/variant/get.hpp: In instantiation of 'typename boost::add_pointer<const U>::type boost::strict_get(const boost::variant<T0, TN ...>*) [with U = const std::vector<blackhole::dynamic_t>&; T0 = blackhole::dynamic_t::null_t; TN = {bool, long unsigned int, long int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<blackhole::dynamic_t, std::allocator<blackhole::dynamic_t> >, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, blackhole::dynamic_t, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, blackhole::dynamic_t> > >}; typename boost::add_pointer<const U>::type = const std::vector<blackhole::dynamic_t>*]':
    /usr/include/boost/variant/get.hpp:269:25:   required from 'typename boost::add_pointer<const U>::type boost::get(const boost::variant<T0, TN ...>*) [with U = const std::vector<blackhole::dynamic_t>&; T0 = blackhole::dynamic_t::null_t; TN = {bool, long unsigned int, long int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<blackhole::dynamic_t, std::allocator<blackhole::dynamic_t> >, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, blackhole::dynamic_t, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, blackhole::dynamic_t> > >}; typename boost::add_pointer<const U>::type = const std::vector<blackhole::dynamic_t>*]'
    /usr/include/blackhole/dynamic.hpp:396:36:   required from 'typename std::enable_if<(blackhole::dynamic_t::is_convertible<T>::value && (! blackhole::type_traits::is_integer<T>::value)), T>::type blackhole::dynamic_t::to() const [with T = const std::vector<blackhole::dynamic_t>&; typename std::enable_if<(blackhole::dynamic_t::is_convertible<T>::value && (! blackhole::type_traits::is_integer<T>::value)), T>::type = const std::vector<blackhole::dynamic_t>&]'
    /home/zbr/rpmbuild/BUILD/elliptics-2.26.9.2/cache/../example/config.hpp:237:49:   required from here
    /usr/include/boost/variant/get.hpp:195:5: error: static assertion failed: boost::variant does not contain specified type U, call to boost::get<U>(const boost::variant<T...>*) will always return NULL
         BOOST_STATIC_ASSERT_MSG(
         ^
    
    opened by bioothod 7
  • blackhole::scoped_attributes_concept_t exception and crash

    blackhole::scoped_attributes_concept_t exception and crash

    Under extensive elliptics testing I've gotten following crash due to some exception It is latest v0.2 branch

    (gdb) bt full
    #0  0x00007f6a538bb9c8 in raise () from /lib64/libc.so.6
    No symbol table info available.
    #1  0x00007f6a538bd65a in abort () from /lib64/libc.so.6
    No symbol table info available.
    #2  0x00007f6a538b4187 in __assert_fail_base () from /lib64/libc.so.6
    No symbol table info available.
    #3  0x00007f6a538b4232 in __assert_fail () from /lib64/libc.so.6
    No symbol table info available.
    #4  0x00007f6a46f8f87c in blackhole::scoped_attributes_concept_t::~scoped_attributes_concept_t (this=0x7f69e8007448, 
        __in_chrg=<optimized out>) at /usr/include/blackhole/implementation/logger.ipp:198
            __PRETTY_FUNCTION__ = "virtual blackhole::scoped_attributes_concept_t::~scoped_attributes_concept_t()"
    #5  0x00007f6a46fa835f in blackhole::scoped_attributes_t::~scoped_attributes_t (this=0x7f69e8007448, __in_chrg=<optimized out>)
        at /usr/include/blackhole/scoped_attributes.hpp:8
    No locals.
    #6  0x00007f6a467ccc2e in dnet_node_unset_trace_id () at /home/zbr/awork/elliptics/bindings/cpp/logger.cpp:178
            local_attributes = @0x7f69e8007670: 0x7f69e8007448
    
    ...
    
    (gdb) frame 4
    #4  0x00007f6a46f8f87c in blackhole::scoped_attributes_concept_t::~scoped_attributes_concept_t (this=0x7f69e8007448, 
        __in_chrg=<optimized out>) at /usr/include/blackhole/implementation/logger.ipp:198
    198     BOOST_ASSERT(m_logger->state.attributes.scoped.get() == this);
    
    opened by bioothod 7
  • Constexpr in facade.hpp

    Constexpr in facade.hpp

    Hi! I have compilation error

    [ 20%] Building CXX object CMakeFiles/hole.dir/src/hole_t.cpp.o
    In file included from /usr/include/blackhole/extensions/facade.hpp:6:0,
                     from /usr/include/cocaine/logging.hpp:28,
                     from /root/prog/hole/include/sputnik/hole/hole_t.h:7,
                     from /root/prog/hole/src/hole_t.cpp:1:
    /usr/include/blackhole/extensions/metaformat.hpp: In function ‘constexpr std::size_t parse_argument(const string_view&, std::size_t&)’:
    /usr/include/blackhole/extensions/metaformat.hpp:23:1: error: expression ‘<throw-expression>’ is not a constant-expression
     }
     ^
    

    as i undestand constexpr function can't throw exceptions

    V: patch T: refactor 
    opened by minaevmike 6
  • can't build cocaine v0.12 with blackhole master

    can't build cocaine v0.12 with blackhole master

    g++ --version
    g++ (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
    
    In file included from /root/prog/cocaine-core/src/service/logging.cpp:26:0:
    /usr/include/blackhole/builder.hpp:68:34: error: declaration of ‘blackhole::v1::builder<blackhole::v1::handler::blocking_t> blackhole::v1::experimental::partial_builder<blackhole::v1::handler::blocking_t, Parent>::builder’ [-fpermissive]
         builder<handler::blocking_t> builder;
                                      ^
    In file included from /usr/include/blackhole/builder.hpp:14:0,
                     from /root/prog/cocaine-core/src/service/logging.cpp:26:
    /usr/include/blackhole/handler/blocking.hpp:14:7: error: changes meaning of ‘builder’ from ‘class blackhole::v1::builder<blackhole::v1::handler::blocking_t>’ [-fpermissive]
     class builder<handler::blocking_t> {
           ^
    In file included from /root/prog/cocaine-core/src/service/logging.cpp:26:0:
    /usr/include/blackhole/builder.hpp:100:28: error: declaration of ‘blackhole::v1::builder<blackhole::v1::formatter::string_t> blackhole::v1::experimental::partial_builder<blackhole::v1::formatter::string_t, Parent>::builder’ [-fpermissive]
         builder<internal_type> builder;
                                ^
    In file included from /usr/include/blackhole/builder.hpp:12:0,
                     from /root/prog/cocaine-core/src/service/logging.cpp:26:
    /usr/include/blackhole/formatter/string.hpp:103:7: error: changes meaning of ‘builder’ from ‘class blackhole::v1::builder<blackhole::v1::formatter::string_t>’ [-fpermissive]
     class builder<formatter::string_t> {
           ^
    In file included from /root/prog/cocaine-core/src/service/logging.cpp:26:0:
    /usr/include/blackhole/builder.hpp:128:28: error: declaration of ‘blackhole::v1::builder<blackhole::v1::sink::console_t> blackhole::v1::experimental::partial_builder<blackhole::v1::sink::console_t, Parent>::builder’ [-fpermissive]
         builder<internal_type> builder;
                                ^
    In file included from /usr/include/blackhole/builder.hpp:13:0,
                     from /root/prog/cocaine-core/src/service/logging.cpp:26:
    /usr/include/blackhole/sink/console.hpp:29:7: error: changes meaning of ‘builder’ from ‘class blackhole::v1::builder<blackhole::v1::sink::console_t>’ [-fpermissive]
     class builder<sink::console_t> {
           ^
    /root/prog/cocaine-core/src/service/logging.cpp: In lambda function:
    /root/prog/cocaine-core/src/service/logging.cpp:79:29: error: ‘configured’ is not a member of ‘blackhole::v1::registry_t’
                 auto registry = blackhole::registry_t::configured();
                                 ^
    /root/prog/cocaine-core/src/service/logging.cpp:80:54: error: expected primary-expression before ‘>’ token
                 registry.add<blackhole::formatter::json_t>();
                                                          ^
    /root/prog/cocaine-core/src/service/logging.cpp:80:56: error: expected primary-expression before ‘)’ token
                 registry.add<blackhole::formatter::json_t>();
                                                            ^
    /root/prog/cocaine-core/src/service/logging.cpp:81:49: error: expected primary-expression before ‘>’ token
                 registry.add<blackhole::sink::file_t>();
                                                     ^
    /root/prog/cocaine-core/src/service/logging.cpp:81:51: error: expected primary-expression before ‘)’ token
                 registry.add<blackhole::sink::file_t>();
                                                       ^
    /root/prog/cocaine-core/src/service/logging.cpp:82:56: error: expected primary-expression before ‘>’ token
                 registry.add<blackhole::sink::socket::tcp_t>();
                                                            ^
    /root/prog/cocaine-core/src/service/logging.cpp:82:58: error: expected primary-expression before ‘)’ token
                 registry.add<blackhole::sink::socket::tcp_t>();
                                                              ^
    /root/prog/cocaine-core/src/service/logging.cpp:83:56: error: expected primary-expression before ‘>’ token
                 registry.add<blackhole::sink::socket::udp_t>();
                                                            ^
    /root/prog/cocaine-core/src/service/logging.cpp:83:58: error: expected primary-expression before ‘)’ token
                 registry.add<blackhole::sink::socket::udp_t>();
                                                              ^
    /root/prog/cocaine-core/src/service/logging.cpp:88:66: error: expected primary-expression before ‘>’ token
                 auto log = registry.builder<blackhole::config::json_t>(stream)
                                                                      ^
    /root/prog/cocaine-core/src/service/logging.cpp:89:18: error: ‘std::stringstream {aka class std::__cxx11::basic_stringstream<char>}’ has no member named ‘build’
                     .build(backend);
                      ^
    CMakeFiles/cocaine-core.dir/build.make:590: recipe for target 'CMakeFiles/cocaine-core.dir/src/service/logging.cpp.o' failed
    make[2]: *** [CMakeFiles/cocaine-core.dir/src/service/logging.cpp.o] Error 1
    CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/cocaine-core.dir/all' failed
    make[1]: *** [CMakeFiles/cocaine-core.dir/all] Error 2
    Makefile:127: recipe for target 'all' failed
    make: *** [all] Error 2
    
    opened by minaevmike 5
  • Add missing move constructors

    Add missing move constructors

    Without this https://github.com/3Hren/cocaine-core cannot be built.

    Because of this: CMakeFiles/cocaine-runtime.dir/src/runtime/runtime.cpp.o: In functionstd::enable_if<std::is_base_of<blackhole::v1::formatter_t, blackhole::v1::formatter::json_t>::value, void>::type blackhole::v1::registry_t::selectblackhole::v1::formatter::json_t()::{lambda(blackhole::v1::config::node_t const&)#1}::operator()(blackhole::v1::config::node_t const&) const': runtime.cpp:(.text.ZZN9blackhole2v110registry_t6selectINS0_9formatter6json_tEEENSt9enable_ifIXsrSt10is_base_ofINS0_11formatter_tET_E5valueEvE4typeEvENKUlRKNS0_6config6node_tEE_clESF[ZZN9blackhole2v110registry_t6selectINS0_9formatter6json_tEEENSt9enable_ifIXsrSt10is_base_ofINS0_11formatter_tET_E5valueEvE4typeEvENKUlRKNS0_6config6node_tEE_clESF]+0x51): undefined reference to blackhole::v1::formatter::json_t::json_t(blackhole::v1::formatter::json_t&&)' CMakeFiles/cocaine-runtime.dir/src/runtime/runtime.cpp.o: In functionstd::enable_if<std::is_base_of<blackhole::v1::sink_t, blackhole::v1::sink::socket::tcp_t>::value, void>::type blackhole::v1::registry_t::selectblackhole::v1::sink::socket::tcp_t()::{lambda(blackhole::v1::config::node_t const&)#1}::operator()(blackhole::v1::config::node_t const&) const': runtime.cpp:(.text.ZZN9blackhole2v110registry_t6selectINS0_4sink6socket5tcp_tEEENSt9enable_ifIXsrSt10is_base_ofINS0_6sink_tET_E5valueEvE4typeEvENKUlRKNS0_6config6node_tEE_clESG[ZZN9blackhole2v110registry_t6selectINS0_4sink6socket5tcp_tEEENSt9enable_ifIXsrSt10is_base_ofINS0_6sink_tET_E5valueEvE4typeEvENKUlRKNS0_6config6node_tEE_clESG]+0x51): undefined reference to blackhole::v1::sink::socket::tcp_t::tcp_t(blackhole::v1::sink::socket::tcp_t&&)' CMakeFiles/cocaine-runtime.dir/src/runtime/runtime.cpp.o: In functionstd::enable_if<std::is_base_of<blackhole::v1::sink_t, blackhole::v1::sink::socket::udp_t>::value, void>::type blackhole::v1::registry_t::selectblackhole::v1::sink::socket::udp_t()::{lambda(blackhole::v1::config::node_t const&)#1}::operator()(blackhole::v1::config::node_t const&) const': runtime.cpp:(.text.ZZN9blackhole2v110registry_t6selectINS0_4sink6socket5udp_tEEENSt9enable_ifIXsrSt10is_base_ofINS0_6sink_tET_E5valueEvE4typeEvENKUlRKNS0_6config6node_tEE_clESG[ZZN9blackhole2v110registry_t6selectINS0_4sink6socket5udp_tEEENSt9enable_ifIXsrSt10is_base_ofINS0_6sink_tET_E5valueEvE4typeEvENKUlRKNS0_6config6node_tEE_clESG]+0x51): undefined reference to blackhole::v1::sink::socket::udp_t::udp_t(blackhole::v1::sink::socket::udp_t&&)'

    opened by CMogilko 5
  • Blackhole rises weird exceptions leading to crash

    Blackhole rises weird exceptions leading to crash

    Under heavy tests blackhole v0.2 raises weird exceptions, most of which lead to crash Here is one of them, I noticed attributes = std::unordered_map with 140106538842976 elements line, which looks wrong. Elliptics log string elliptics: self: addr: no address, resetting state: 0xa73e50 is quite ordinary, it is emitted when client disconnects.

    I have coredump, if needed

    (gdb) bt full
    #0  0x00007f6e68df79c8 in raise () from /lib64/libc.so.6
    No symbol table info available.
    #1  0x00007f6e68df965a in abort () from /lib64/libc.so.6
    No symbol table info available.
    #2  0x00007f6e69731b4d in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc++.so.6
    No symbol table info available.
    #3  0x00007f6e6972f996 in ?? () from /lib64/libstdc++.so.6
    No symbol table info available.
    #4  0x00007f6e6972e989 in ?? () from /lib64/libstdc++.so.6
    No symbol table info available.
    #5  0x00007f6e6972f2e5 in __gxx_personality_v0 () from /lib64/libstdc++.so.6
    No symbol table info available.
    #6  0x00007f6e69192f13 in ?? () from /lib64/libgcc_s.so.1
    No symbol table info available.
    #7  0x00007f6e69193437 in _Unwind_Resume () from /lib64/libgcc_s.so.1
    No symbol table info available.
    #8  0x00007f6e6c6fdc54 in blackhole::logger_base_t::get_event_attributes (this=0x7f6d7c001a50) at /usr/include/blackhole/implementation/logger.ipp:165
            tv = {tv_sec = 140112243037770, tv_usec = 1}
            attributes = std::unordered_map with 140106538842976 elements
    #9  0x00007f6e6c727b66 in boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list8<blackhole::dynamic_t::null_t, bool, unsigned long, long, double, std::string, std::vector<blackhole::dynamic_t, std::allocator<blackhole::dynamic_t> >, std::map<std::string, blackhole::dynamic_t, std::less<std::string>, std::allocator<std::pair<std::string const, blackhole::dynamic_t> > > > > >::initializer_node::initialize(void*, blackhole::dynamic_t::null_t&&) (dest=0xa385e8, operand=<unknown type in /home/zbr/awork/elliptics/build/library/libelliptics.so.2.26, CU 0xb7c69, DIE 0x12ac2f>) at /usr/include/boost/variant/detail/initializer.hpp:115
    No locals.
    #10 0x00007f6e6c71ae3e in boost::move<blackhole::dynamic_t::null_t&> (t=...) at /usr/include/boost/move/utility_core.hpp:183
    No locals.
    #11 0x00007f6e6c79976f in dnet_sink_t::emit (this=0xa5ef40, prio=cocaine::logging::error, app="storage/core", message="elliptics: self: addr: no address, resetting state: 0xa73e50 ") at /home/zbr/awork/elliptics/srw/srw.cpp:274
            record = {attributes = std::unordered_map with 8 elements = {["source"] = {value = {which_ = 7, storage_ = {<boost::detail::aligned_storage::aligned_storage_imp<16ul, 8ul>> = {data_ = {buf = "\270\026\000|m\177\000\000.nonbloc", align_ = {<No data fields>}}}, static size = <optimized out>, static alignment = <optimized out>}}, scope = blackhole::log::attribute::scope::local}, ["app"] = {value = {which_ = 7, storage_ = {<boost::detail::aligned_storage::aligned_storage_imp<16ul, 8ul>> = {data_ = {buf = "\030\230\245\000\000\000\000\000\000\000\000\000m\177\000", align_ = {<No data fields>}}}, static size = <optimized out>, static alignment = <optimized out>}}, scope = blackhole::log::attribute::scope::local}, ["message"] = {value = {which_ = 7, storage_ = {<boost::detail::aligned_storage::aligned_storage_imp<16ul, 8ul>> = {data_ = {buf = "(\026\000|m\177\000\000\270\210\r\000\000\000\000", align_ = {<No data fields>}}}, static size = <optimized out>, static alignment = <optimized out>}}, scope = blackhole::log::attribute::scope::event}, ["severity"] = {value = {which_ = 0, storage_ = {<boost::detail::aligned_storage::aligned_storage_imp<16ul, 8ul>> = {data_ = {buf = "\004\000\000\000\000\000\000\000\245\207\r\000\000\000\000", align_ = {<No data fields>}}}, static size = <optimized out>, static alignment = <optimized out>}}, scope = blackhole::log::attribute::scope::event}, ["pid"] = {value = {which_ = 1, storage_ = {<boost::detail::aligned_storage::aligned_storage_imp<16ul, 8ul>> = {data_ = {buf = "\001\062\000\000\000\000\000\000\000\000\000\000n\177\000", align_ = {<No data fields>}}}, static size = <optimized out>, static alignment = <optimized out>}}, scope = blackhole::log::attribute::scope::universe}, ["lwp"] = {value = {which_ = 5, storage_ = {<boost::detail::aligned_storage::aligned_storage_imp<16ul, 8ul>> = {data_ = {buf = "Q3\000\000\000\000\000\000\371\206\r\000\000\000\000", align_ = {<No data fields>}}}, static size = <optimized out>, static alignment = <optimized out>}}, scope = blackhole::log::attribute::scope::thread}, ["timestamp"] = {value = {which_ = 8, storage_ = {<boost::detail::aligned_storage::aligned_storage_imp<16ul, 8ul>> = {data_ = {buf = "D0\356U\000\000\000\000\027\211\r\000\000\000\000", align_ = {<No data fields>}}}, static size = <optimized out>, static alignment = <optimized out>}}, scope = blackhole::log::attribute::scope::event}, ["request_id"] = {value = {which_ = 5, storage_ = {<boost::detail::aligned_storage::aligned_storage_imp<16ul, 8ul>> = {data_ = {buf = '\000' <repeats 12 times>, "n\177\000", align_ = {<No data fields>}}}, static size = <optimized out>, static alignment = <optimized out>}}, scope = blackhole::log::attribute::scope::event}}}
            level = blackhole::defaults::severity::error
    #12 0x00007f6e6bc9f80d in cocaine::logging::log_t::emit<std::string> (this=0xa60ea0, level=10882720, format=...) at /usr/src/debug/libcocaine-core2-0.11.3.1/include/cocaine/logging.hpp:69
    No locals.
    #13 0x00007f6e0832c078 in cocaine::storage::log_adapter_impl_t::handle (this=0xa63030, record=...) at /home/zbr/awork/elliptics/cocaine/plugins/storage.cpp:70
            level = blackhole::defaults::severity::error
            cocaine_level = cocaine::logging::error
    #14 0x00007f6e6c6fdbe3 in blackhole::logger_base_t::push(blackhole::log::record_t&&) const (this=0xa62bc0, record=<unknown type in /home/zbr/awork/elliptics/build/library/libelliptics.so.2.26, CU 0xb7c69, DIE 0x17c014>) at /usr/include/blackhole/implementation/logger.ipp:161
            lock = {m = 0xa62da0, is_locked = true}
    #15 0x00007f6e6c727b66 in boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list8<blackhole::dynamic_t::null_t, bool, unsigned long, long, double, std::string, std::vector<blackhole::dynamic_t, std::allocator<blackhole::dynamic_t> >, std::map<std::string, blackhole::dynamic_t, std::less<std::string>, std::allocator<std::pair<std::string const, blackhole::dynamic_t> > > > > >::initializer_node::initialize(void*, blackhole::dynamic_t::null_t&&) (dest=0xa648b8, operand=<unknown type in /home/zbr/awork/elliptics/build/library/libelliptics.so.2.26, CU 0xb7c69, DIE 0x12ac2f>) at /usr/include/boost/variant/detail/initializer.hpp:115
    No locals.
    #16 0x00007f6e6aacd35a in dnet_log_write (logger=0xa648b8, record=0x7f6d187aa5d0, format=0x7f6e6ab156e0 "self: addr: %s, resetting state: %p") at /home/zbr/awork/elliptics/bindings/cpp/logger.cpp:263
            args = {{gp_offset = 40, fp_offset = 48, overflow_arg_area = 0x7f6d187a8480, reg_save_area = 0x7f6d187a83c0}}
    #17 0x00007f6e6aabe213 in dnet_io_process_network (data_=0xa65cf8) at /home/zbr/awork/elliptics/library/pool.c:896
            local_dnet_log = 0xa648b8
            local_dnet_record = 0x7f6d187aa5d0
            addr_str = "no address", '\000' <repeats 117 times>
            nio = 0xa65cf8
            n = 0xa64cd0
            data = 0xa74240
            st = 0xa73e50
            evs_size = 100
            evs = 0x7f6d7c0008c0
            evs_tmp = 0x0
            ts = {tv_sec = 140106128162816, tv_nsec = 10888720}
            tmp = 1
            err = -104
            num_events = 1
            i = 0
            prev_tv = {tv_sec = 1441673143, tv_usec = 269220}
            curr_tv = {tv_sec = 10888720, tv_usec = 10888720}
    #18 0x00007f6e6a6f2555 in start_thread () from /lib64/libpthread.so.0
    No symbol table info available.
    #19 0x00007f6e68ec5b9d in clone () from /lib64/libc.so.6
    No symbol table info available.
    
    opened by bioothod 5
  • Could not compile under FreeBSD 10.3+Clang 3.4.1+Boost 1.58 or FreeBSD 11+Clang 3.8.0+Boost 1.56  - 2 errors

    Could not compile under FreeBSD 10.3+Clang 3.4.1+Boost 1.58 or FreeBSD 11+Clang 3.8.0+Boost 1.56 - 2 errors

    FreeBSD 10.3, Clang 3.4.1, Boost 1.58 Branch issue/xx/beta

    Error # 1

    /home/username/bhbeta/src/formatter/json.cpp:51:9: error: static_assert failed
          "type mismatch"
            static_assert(
            ^
    

    Error # 2

    In file included from /home/username/bhbeta/src/formatter/json.cpp:13:
    /home/username/bhbeta/foreign/rapidjson/include/rapidjson/document.h:1065:22: error:
          call to constructor of 'rapidjson::GenericValue<rapidjson::UTF8<char>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> >' is ambiguous
            GenericValue v(value);
                         ^ ~~~~~
    

    Full log:

    [  2%] Building CXX object CMakeFiles/blackhole.dir/src/formatter/json.cpp.o
    In file included from /home/username/bhbeta/src/formatter/json.cpp:7:
    In file included from /usr/local/include/boost/optional/optional.hpp:33:
    In file included from /usr/local/include/boost/type_traits/type_with_alignment.hpp:11:
    In file included from /usr/local/include/boost/mpl/if.hpp:19:
    In file included from /usr/local/include/boost/mpl/aux_/na_spec.hpp:28:
    In file included from /usr/local/include/boost/mpl/aux_/preprocessor/def_params_tail.hpp:66:
    In file included from /usr/local/include/boost/preprocessor/arithmetic/add.hpp:21:
    In file included from /usr/local/include/boost/preprocessor/tuple/elem.hpp:21:
    In file included from /usr/local/include/boost/preprocessor/facilities/overload.hpp:17:
    /usr/local/include/boost/preprocessor/variadic/size.hpp:22:9: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    #    if BOOST_PP_VARIADICS_MSVC
            ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:7:
    In file included from /usr/local/include/boost/optional/optional.hpp:33:
    In file included from /usr/local/include/boost/type_traits/type_with_alignment.hpp:11:
    In file included from /usr/local/include/boost/mpl/if.hpp:19:
    In file included from /usr/local/include/boost/mpl/aux_/na_spec.hpp:28:
    In file included from /usr/local/include/boost/mpl/aux_/preprocessor/def_params_tail.hpp:66:
    In file included from /usr/local/include/boost/preprocessor/arithmetic/add.hpp:21:
    In file included from /usr/local/include/boost/preprocessor/tuple/elem.hpp:22:
    In file included from /usr/local/include/boost/preprocessor/tuple/rem.hpp:20:
    /usr/local/include/boost/preprocessor/tuple/detail/is_single_return.hpp:19:28: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    # if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC
                               ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:7:
    In file included from /usr/local/include/boost/optional/optional.hpp:33:
    In file included from /usr/local/include/boost/type_traits/type_with_alignment.hpp:11:
    In file included from /usr/local/include/boost/mpl/if.hpp:19:
    In file included from /usr/local/include/boost/mpl/aux_/na_spec.hpp:28:
    In file included from /usr/local/include/boost/mpl/aux_/preprocessor/def_params_tail.hpp:66:
    In file included from /usr/local/include/boost/preprocessor/arithmetic/add.hpp:21:
    In file included from /usr/local/include/boost/preprocessor/tuple/elem.hpp:22:
    /usr/local/include/boost/preprocessor/tuple/rem.hpp:25:8: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    #        if BOOST_PP_VARIADICS_MSVC
                ^
    /usr/local/include/boost/preprocessor/tuple/rem.hpp:39:30: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    # if BOOST_PP_VARIADICS && !(BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400)
                                 ^
    /usr/local/include/boost/preprocessor/tuple/rem.hpp:40:8: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    #        if BOOST_PP_VARIADICS_MSVC
                ^
    /usr/local/include/boost/preprocessor/tuple/rem.hpp:123:9: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    #    if BOOST_PP_VARIADICS_MSVC
            ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:7:
    In file included from /usr/local/include/boost/optional/optional.hpp:33:
    In file included from /usr/local/include/boost/type_traits/type_with_alignment.hpp:11:
    In file included from /usr/local/include/boost/mpl/if.hpp:19:
    In file included from /usr/local/include/boost/mpl/aux_/na_spec.hpp:28:
    In file included from /usr/local/include/boost/mpl/aux_/preprocessor/def_params_tail.hpp:66:
    In file included from /usr/local/include/boost/preprocessor/arithmetic/add.hpp:21:
    In file included from /usr/local/include/boost/preprocessor/tuple/elem.hpp:23:
    /usr/local/include/boost/preprocessor/variadic/elem.hpp:22:9: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    #    if BOOST_PP_VARIADICS_MSVC
            ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:7:
    In file included from /usr/local/include/boost/optional/optional.hpp:33:
    In file included from /usr/local/include/boost/type_traits/type_with_alignment.hpp:11:
    In file included from /usr/local/include/boost/mpl/if.hpp:19:
    In file included from /usr/local/include/boost/mpl/aux_/na_spec.hpp:28:
    In file included from /usr/local/include/boost/mpl/aux_/preprocessor/def_params_tail.hpp:66:
    In file included from /usr/local/include/boost/preprocessor/arithmetic/add.hpp:21:
    /usr/local/include/boost/preprocessor/tuple/elem.hpp:27:9: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    #    if BOOST_PP_VARIADICS_MSVC
            ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:7:
    In file included from /usr/local/include/boost/optional/optional.hpp:33:
    In file included from /usr/local/include/boost/type_traits/type_with_alignment.hpp:13:
    In file included from /usr/local/include/boost/preprocessor/tuple/to_list.hpp:21:
    /usr/local/include/boost/preprocessor/tuple/size.hpp:21:9: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    #    if BOOST_PP_VARIADICS_MSVC
            ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:7:
    In file included from /usr/local/include/boost/optional/optional.hpp:33:
    In file included from /usr/local/include/boost/type_traits/type_with_alignment.hpp:13:
    /usr/local/include/boost/preprocessor/tuple/to_list.hpp:27:9: warning:
          'BOOST_PP_VARIADICS_MSVC' is not defined, evaluates to 0 [-Wundef]
    #    if BOOST_PP_VARIADICS_MSVC
            ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:7:
    /usr/local/include/boost/optional/optional.hpp:1254:53: warning: unused
          parameter 'out' [-Wunused-parameter]
    operator<<(std::basic_ostream<CharType, CharTrait>& out, optional_detail...
                                                        ^
    /usr/local/include/boost/optional/optional.hpp:1254:95: warning: unused
          parameter 'v' [-Wunused-parameter]
      ...CharTrait>& out, optional_detail::optional_tag const& v)
                                                               ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:21:
    In file included from /home/username/bhbeta/include/blackhole/record.hpp:7:
    In file included from /home/username/bhbeta/include/blackhole/attributes.hpp:13:
    In file included from /usr/local/include/boost/container/small_vector.hpp:27:
    In file included from /usr/local/include/boost/container/vector.hpp:27:
    In file included from /usr/local/include/boost/container/allocator_traits.hpp:39:
    /usr/local/include/boost/intrusive/pointer_traits.hpp:200:7: warning: unknown
          command tag name [-Wdocumentation-unknown-command]
       ///@cond
          ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:21:
    In file included from /home/username/bhbeta/include/blackhole/record.hpp:7:
    In file included from /home/username/bhbeta/include/blackhole/attributes.hpp:13:
    In file included from /usr/local/include/boost/container/small_vector.hpp:27:
    In file included from /usr/local/include/boost/container/vector.hpp:28:
    In file included from /usr/local/include/boost/container/new_allocator.hpp:24:
    /usr/local/include/boost/container/throw_exception.hpp:95:4: warning: function
          'throw_bad_alloc' could be declared with attribute 'noreturn'
          [-Wmissing-noreturn]
       {
       ^
    /usr/local/include/boost/container/throw_exception.hpp:111:4: warning: function
          'throw_out_of_range' could be declared with attribute 'noreturn'
          [-Wmissing-noreturn]
       {
       ^
    /usr/local/include/boost/container/throw_exception.hpp:127:4: warning: function
          'throw_length_error' could be declared with attribute 'noreturn'
          [-Wmissing-noreturn]
       {
       ^
    /usr/local/include/boost/container/throw_exception.hpp:144:4: warning: function
          'throw_logic_error' could be declared with attribute 'noreturn'
          [-Wmissing-noreturn]
       {
       ^
    /usr/local/include/boost/container/throw_exception.hpp:160:4: warning: function
          'throw_runtime_error' could be declared with attribute 'noreturn'
          [-Wmissing-noreturn]
       {
       ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:21:
    In file included from /home/username/bhbeta/include/blackhole/record.hpp:7:
    In file included from /home/username/bhbeta/include/blackhole/attributes.hpp:13:
    In file included from /usr/local/include/boost/container/small_vector.hpp:27:
    /usr/local/include/boost/container/vector.hpp:584:45: warning: unused parameter
          'x' [-Wunused-parameter]
       void swap_resources(vector_alloc_holder &x) BOOST_NOEXCEPT_OR_NOTHROW
                                                ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:24:
    In file included from /home/username/bhbeta/include/blackhole/detail/attribute.hpp:3:
    In file included from /usr/local/include/boost/variant/variant.hpp:21:
    In file included from /usr/local/include/boost/type_index.hpp:29:
    In file included from /usr/local/include/boost/type_index/stl_type_index.hpp:22:
    /usr/local/include/boost/type_index/type_index_facade.hpp:68:9: warning:
          unknown command tag name [-Wdocumentation-unknown-command]
        /// @endcond
            ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:24:
    In file included from /home/username/bhbeta/include/blackhole/detail/attribute.hpp:3:
    In file included from /usr/local/include/boost/variant/variant.hpp:21:
    In file included from /usr/local/include/boost/type_index.hpp:29:
    /usr/local/include/boost/type_index/stl_type_index.hpp:178:5: warning:
          '_MSC_VER' is not defined, evaluates to 0 [-Wundef]
    #if _MSC_VER > 1600 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5 && defined(_...
        ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:24:
    In file included from /home/username/bhbeta/include/blackhole/detail/attribute.hpp:3:
    In file included from /usr/local/include/boost/variant/variant.hpp:29:
    /usr/local/include/boost/variant/detail/forced_return.hpp:47:1: warning:
          function 'forced_return<void>' could be declared with attribute 'noreturn'
          [-Wmissing-noreturn]
    {
    ^
    /home/username/bhbeta/src/formatter/json.cpp:204:7: warning: '__APPLE__' is not
          defined, evaluates to 0 [-Wundef]
    #elif __APPLE__
          ^
    /home/username/bhbeta/src/formatter/json.cpp:51:9: error: static_assert failed
          "type mismatch"
            static_assert(
            ^
    /home/username/bhbeta/src/formatter/json.cpp:267:9: note: in instantiation of
          function template specialization 'blackhole::v1::formatter::<anonymous
          namespace>::visitor_t::operator()<long long>' requested here
            visitor(value);
            ^
    /home/username/bhbeta/src/formatter/json.cpp:226:13: note: in instantiation of
          function template specialization
          'blackhole::v1::formatter::json_t::inner_t::builder<rapidjson::GenericDocument<rapidjson::UTF8<char>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> > >::apply<long
          long>' requested here
                apply("timestamp", std::chrono::duration_cast<
                ^
    /home/username/bhbeta/src/formatter/json.cpp:328:13: note: in instantiation of member
          function
          'blackhole::v1::formatter::json_t::inner_t::builder<rapidjson::GenericDocument<rapidjson::UTF8<char>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> > >::timestamp'
          requested here
        builder.timestamp();
                ^
    In file included from /home/username/bhbeta/src/formatter/json.cpp:13:
    /home/username/bhbeta/foreign/rapidjson/include/rapidjson/document.h:1065:22: error:
          call to constructor of 'rapidjson::GenericValue<rapidjson::UTF8<char>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> >' is ambiguous
            GenericValue v(value);
                         ^ ~~~~~
    /home/username/bhbeta/foreign/rapidjson/include/rapidjson/document.h:1136:16: note:
          in instantiation of function template specialization
          'rapidjson::GenericValue<rapidjson::UTF8<char>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> >::AddMember<long
          long>' requested here
            return AddMember(n, value, allocator);
                   ^
    /home/username/bhbeta/src/formatter/json.cpp:56:14: note: in instantiation of
          function template specialization
          'rapidjson::GenericValue<rapidjson::UTF8<char>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> >::AddMember<long
          long>' requested here
            node.AddMember(rapidjson::StringRef(name.data(), name.size()), v...
                 ^
    /home/username/bhbeta/src/formatter/json.cpp:267:9: note: in instantiation of
          function template specialization 'blackhole::v1::formatter::<anonymous
          namespace>::visitor_t::operator()<long long>' requested here
            visitor(value);
            ^
    /home/username/bhbeta/src/formatter/json.cpp:226:13: note: in instantiation of
          function template specialization
          'blackhole::v1::formatter::json_t::inner_t::builder<rapidjson::GenericDocument<rapidjson::UTF8<char>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> > >::apply<long
          long>' requested here
                apply("timestamp", std::chrono::duration_cast<
                ^
    /home/username/bhbeta/src/formatter/json.cpp:328:13: note: in instantiation of member
          function
          'blackhole::v1::formatter::json_t::inner_t::builder<rapidjson::GenericDocument<rapidjson::UTF8<char>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>,
          rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> > >::timestamp'
          requested here
        builder.timestamp();
                ^
    /home/username/bhbeta/foreign/rapidjson/include/rapidjson/document.h:510:14: note:
          candidate constructor
        explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_(), flags_(kN...
                 ^
    /home/username/bhbeta/foreign/rapidjson/include/rapidjson/document.h:517:14: note:
          candidate constructor
        explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_(), flag...
                 ^
    /home/username/bhbeta/foreign/rapidjson/include/rapidjson/document.h:524:14: note:
          candidate constructor
        explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_(), fla...
                 ^
    /home/username/bhbeta/foreign/rapidjson/include/rapidjson/document.h:538:14: note:
          candidate constructor
        explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_(), fl...
                 ^
    /home/username/bhbeta/foreign/rapidjson/include/rapidjson/document.h:549:14: note:
          candidate constructor
        explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_(), flags_...
                 ^
    23 warnings and 2 errors generated.
    *** Error code 1
    
    Stop.
    make[2]: stopped in /usr/home/username/bhbeta
    *** Error code 1
    
    Stop.
    make[1]: stopped in /usr/home/username/bhbeta
    *** Error code 1
    
    Stop.
    make: stopped in /usr/home/username/bhbeta
    root@freeb1:/home/username/bhbeta #
    
    opened by abclogin 4
  • Configurable leftover placeholder

    Configurable leftover placeholder

    For string formatting Blackhole should also support the leftover placeholder starting with ... and meaning to print all userspace attributes in a reverse order they were provided.

    These kind of attributes can be configured using special syntax, similar with the timestamp attribute with an optional separator.

    For example the following placeholder {[...]:{{name}={value}:p}{\t:s}} results in tab separated key-value pairs like id=42 prefixed with [ and suffixed with ] characters.

    So the following line ``{[...]:{{name}={value}:p}{\t:s}s}` is treated as:

    • "..." - reserved placeholder name, meaning that we should print all attributes with non-reserved names.
    • "{name}={value}" - pattern for each attribute key-value pair.
    • "\t" - separator.
    • "[" - prefix, that is inserted before entire section if there at least one attribute, otherwise not printed.
    • "]" - prefix, that is inserted before entire section if there at least one attribute, otherwise not printed.
    • "s" - type. Currently we support only s type, meaning print all attributes without filtering, i.e. even attributes with duplicated names.

    All sections are optional with the following default values:

    • "{name}: {value}" pattern.
    • ",\s" separator.
    • empty prefix
    • empty suffix.
    • "s" type.

    Grammar:

    Grammar     ::= '{' Prefix? '...' Suffix? (':' Extension* FormatSpec?)? '}'
    Extension   ::= '{' (((Any -':')* ':' [ps] '}' ('}' (Any - ':')* ':' [ps] '}')*))
    Pattern     ::= '{' (PatternLiteral | Name | Value)* ':p}'
    FormatSpec  ::= [>^<]? [0-9]* [su]
    
    • [x] Drop name field for leftover placeholder (~30m).
    • [x] Spec parser into pattern, separator, prefix, suffix and type (~30m).
    • [x] Support custom key-value pattern (~120m).
      • [x] Pattern tokenizer (~60m).
      • [x] Token visitor with spec support both for keys and values (~30m).
      • [x] Handle {{ and }} cases (~30m).
    • [x] Separator support (~30m).
    • [x] Explicit type support (~10m).
    • [x] Default values (~30m).
    • [x] More tests for each FSM transition.
    • [x] Fix tests.
    • [x] Fix benchmarks. @antmat, @kdmitry, @noxiouz discuss if you wish to.
    P: normal V: minor T: enhancement 
    opened by 3Hren 4
  • [Feature] %zu length specifier

    [Feature] %zu length specifier

    ... and other C99 printf format specifiers

    http://www.cplusplus.com/reference/cstdio/printf/ http://en.wikipedia.org/wiki/Printf_format_string#Format_placeholders

    opened by abudnik 4
  • Multiple loggers with different severity level

    Multiple loggers with different severity level

    Hi I want to know how to configure multiple loggers for same file sink.

    1. Configuration example with multiple loggers
    2. Different severity level for each logger
    3. Dynamically changing severity level for a particular logger

    It will be really helpful to understand possible ways for above scenario. Thanks.

    opened by rajdippatel-emc 0
  • Key Value Pair (tskv) value as no double quotes User-Agent=Mozilla Firefox

    Key Value Pair (tskv) value as no double quotes User-Agent=Mozilla Firefox

    Key Value Pair (tskv) value as no double quotes User-Agent=Mozilla Firefox

    Actual value

    pid=4780 tid=0x7fa4f7894b80 message=file does not exist: /var/www/favicon.ico Cache=true Cache-Duration=10 User-Agent=Mozilla Firefox

    Expected value

    pid=4780 tid=0x7fa4f7894b80 message="file does not exist: /var/www/favicon.ico" Cache=true Cache-Duration=10 User-Agent="Mozilla Firefox" User-Agent="Mozilla Firefox"

    opened by ledison-gomas 0
  • How to increase severity to filter logs

    How to increase severity to filter logs

    Hi,

    I'm trying to use this library but i don't understand how I should configure the input json, to maintain only warning and errors:

    Is this possible?

    "root": [{
                "type": "blocking",
                "formatter": {
                    "type": "string",
                    "sevmap": ["D", "I", "W", "E"],
                    "pattern": "{timestamp} [{severity}] [{thread}] [{process}] {message} |raw: {...:{{name}={value}:p}s}",
                },
                "sinks": [{
                    "type": "console"
                }]
            }]
    
    opened by pie-r 1
  • Port blackhole to Visual Studio 2017

    Port blackhole to Visual Studio 2017

    blackhole does not build with Visual Studio 2017. (I haven't tired it yet, but my educated guess is, other Visual Studio compiler won't work either.)

    More or less a prerequisite for implementing this issue are #186 and #188.

    opened by Maturin 1
Releases(v1.9.0)
  • v1.9.0(Sep 14, 2017)

  • v1.7.0(Jun 28, 2017)

  • v1.6.0(Apr 13, 2017)

    Added

    • Allow comments and trailing commas in the JSON config.
    • Allow to specify how to pick time in TSKV formatter (#168). This change allows to specify how Blackhole should pick the time during formatting timestamps using TSKV formatter.

    Changed

    • Replace deprecated OS X stuff with modern one.
    Source code(tar.gz)
    Source code(zip)
  • v1.5.0(Feb 14, 2017)

    Added

    • Lambda expressions with capture-list can now be used as formatting arguments. This allows to log arguments that require heavyweight transformation before the result can be used.

    For example:

    logger.log(0, "[::] - esafronov [10/Oct/2000:13:55:36 -0700] 'GET {} HTTP/1.0' 200 2326",
        [&](std::ostream& stream) -> std::ostream& {
            return stream << boost::join(paths, "/");
        }
    );
    
    Source code(tar.gz)
    Source code(zip)
  • v1.4.0(Feb 14, 2017)

  • v1.3.0(Oct 25, 2016)

    Added

    • Records are now aware of lightweight process id - LWP (or SPID).

      On Linux an LWP is a process created to facilitate a user-space thread. Each user-thread has a 1x1 mapping to an LWP. An LWP is associated with its own unique positive number, that we store in the record at the construction time. For other platforms there is always 0 stored in the record instead.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.1(Aug 29, 2016)

    Fixed

    • Extend optional placeholders grammar. This change allows to specify fill, align and precision specification for optional placeholders when configuring the pattern formatter.

      Also the type specifier is now optional, allowing to specify no type, making libfmt to select the proper formatting itself.

      This change should fix a bug, where it’s impossible to specify the default integral value for string-formatted placeholder.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Aug 29, 2016)

    Added

    • JSON formatter can now apply custom attributes formatting. This feature can be also configured using "formatting" key in the config.
    • String formatter now supports optional placeholders with default value (#150).

      Fixed

    • Limit min queue factor value to 2. Otherwise an assertion inside MPSC queue is triggered.
    • Repair suddenly broken Google Mocking Library link.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Aug 6, 2016)

    Added

    • Introduce new development handler with eye-candy colored output.

    Changed

    • Note, that there are some symbols, that are wrapped into experimental namespace. These symbols don't adhere semantic versioning and, well... experimental. Use them with caution and only, where you want to try super-unstable features, which can be changed or even dropped.
    • Hide boost::asio::detail namespace, which are supposed to be hidden by default, but the ancient GNU linker exports them anyway.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(Aug 6, 2016)

  • v1.0.1(Aug 6, 2016)

  • v1.0.0(Aug 6, 2016)

    Added

    • The Blackhole is completely rewritten from the scratch, there is no need to duplicate README here.
    • Integration with CodeCov (#66).
    • Keep a changelog (#67).
    • Embed libcppformat directly into the Blackhole (#68).

    Changed

    • Hide rapidjson symbols entirely (#78).
    • All formatters, sinks and handlers no longer export their symbols and can be constructed only through associated factories as unsized objects.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0-0alpha8(Mar 3, 2016)

  • v1.0.0-0alpha7(Feb 18, 2016)

    Features

    • JSON formatter now inserts process and thread id fields.
    • Flush interval option can now be specified in a config to the file appender.
    • Added blocking TCP appender to be able to emit log messages via TCP socket.

    API

    • Remove filtering from sink interface, because the filtering concept needed to reviewed completely. Before this change every sink just returned true no matter what. This information gave nothing, because otherwise all users must check before emitting messages while they can just emit. Instead of this we'd better introduce custom filters for sinks that can be applied using special filtering decorator. We recommend you to recompile your dependencies to avoid random crashes.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0-0alpha6(Feb 17, 2016)

  • v1.0.0-0alpha5(Feb 17, 2016)

  • v1.0.0-0alpha4(Feb 8, 2016)

    Features

    • JSON formatter can now mutate the timestamp field using standard patterns.

    Bug fixes:

    • Attribute visitors now can properly be destructed using pointer to to the interface.
    • Implement applying visitors for attributes.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0-0alpha3(Feb 3, 2016)

  • v0.5.0(Apr 9, 2015)

    Features

    • Inline namespaces. Allows to link together multiple libraries that are compiled with different Blackhole versions.
    • Lightweight process attribute for OS X targets.
    • Variadic placeholder filter policy for string formatter.
    Source code(tar.gz)
    Source code(zip)
  • v0.4.1(Feb 14, 2015)

    Bug fixes

    • Fixed corrupted move constructor for logger class.

    Accidentally I've forgot to copy an exception handler when moving logger objects, which resulted in bad function call.

    Other

    • Optional printf-like syntax checking option.

    Blackhole's printf-like syntax checking now can be disabled by configuring BLACKHOLE_CHECK_FORMAT_SYNTAX macro variable.

    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Jan 13, 2015)

    Features

    • Combined logger concept. Now all loggers - are just sets of features combined in a single logger object. When specializing combined logger, you should specify additional parameters, by which filtering should occur when opening a record and before they will be merged with internal attributes set. For example you may specify no additional parameters and you get the simplest logger case. Another case - when you want to perform early filtering by verbosity level you can just specify its type with combination of base logger and the filtering function will require that level type.
    • Filtering policies, which provide almost costless filtering. A composite logger accepts additional policy parameter instead of mixed type and its argument pack. All methods, that opens a record now accepts variadic pack which is forwarded to that policy. Additional attributes insertion into an internal set can be implemented using population trait, which is provided as first template parameter in a filtering policy.
    • Threading policy support for logger. A composite logger can be configured with desired threading policy. That means if the logger doesn't require internal synchronization, it won't do it (if the corresponding policy is provided).
    • Internal attributes attachment as a feature. Every project should define which of internal attributes (PID, TID, etc.) should be attached to every logging event.

    Bug fixes

    • Fix string literal warnings on some ancient compilers.
    • Workaround GCC 4.4 pragmas.
    • Checking frontend set emptiness is now always under the lock.

    API

    • It's possible to forward all required arguments to final logger's constructor, while creating it through a repository.
    • Logger's move constructor, move assignment operator and swap function no longer contain noexcept specifications, because given methods actually can throw. This is a breaking change.
    • Disabled tracking feature, because it shouldn't be in a logger itself, but somewhere else. This is a breaking change.
    • Verbose logger concept review. No longer possible to open verbose logger's record without specifying severity level. This is required due to fact, that there is a primary filtering now, which strongly required severity level provided. Moreover there can be user specific filtering function that be cannot ignore.
    • Proper verbose logger initialization with a given severity level. No longer possible to initialize verbose logger with garbage level value, because user specific severity enumeration may start with any value. Instead of this, the User if forced to provide severity threshold explicitly. Verbosity threshold should always be specified, when setting verbosity to a logger, even with filtering function. This is a breaking change.
    • Drop global logger attribute set. After half year of user experience I've realized that nobody uses logging-attached attributes. The main reason of it - because of Wrappers. You can create logger wrapper, attach some attributes and work with it without copying underlying logger resources like file descriptors or sockets. As a result - you can have only one logger for application, but with multiple wrappers. This is a big advantage, but this is a breaking change.
    • Dropped logger concept classes, because it was inconvenient and buggy. This is a breaking change.
    • Redesign invalid record concept. When opening a record there is a non-zero chance, that you will receive an empty record with no attributes attached. Previously it was considered as invalid record, because there was at least pid and tid attributes attached. But now seems to be there is no need to attach internal attributes before filtering. However now it is considered as valid, just without attributes. This is a breaking change.
    • Filtering function parameters review. Logging filtering function now accepts lightweight combined attribute set view. Technically it allows to perform faster filtering, because there is no need to construct combined set - it will be constructed only if the filtering succeed. This is a breaking change.
    • Deprecated file blackhole/log.hpp file is no longer part of public API, just as planned. This is a breaking change.

    Other

    • Internal and external attribute sets initial capacity can be configured using macro variables.
    • Clang support on non OS X targets.
    • Documentation has been slightly changed and restyled.
    • Code coverage analyze using lcov util. No more words, just type make coverage and you will see.
    • No longer fetch gtest/gmock as submodules. Now these helpful frameworks are obtained via cmake download feature.
    • No longer fetch benchmarking framework as submodule. Instead of that, cmake download feature is used.

    Performance

    • Changed attribute set underlying representation. Now attribute set is internally represented as vector of pairs. This change allows to keep attributes in single memory block, which is good for caching and performance. On the other hand attribute lookup time by user attributes may increase, because they are scanned using linear search. Also I don't see any need for handling duplicates, so now there can be duplicates (which actually can be eaten if needed). There are two attributes sets in every record: internal and external. Internal attributes is setting by logger itself: message, severity, timestamp, pid, tid or lwp. All attributes that is configured via scoped sets or wrappers - are external. This distribution allows me in the future to map each internal attribute with its unique number to perform even more faster table lookup. This change increases performance of almost every case by approximately 20-30%.
    • Got rid of several unnecessary file includes, which saves some compile time.
    • Avoid unnecessary string copying or moving when comparing attributes.
    • Explicitly move the value when opening a record with a single attribute.

    Testing

    • Added multithreaded scalability benchmarks.
    • Added huge number of benchmarks (approximately 300), that test every possible combination of cases. These are generated using preprocessor magic.
    • Fixed possible conditional jump. To check results from functions, which can go the wrong way - is a good idea! Sometimes strftime cannot fill provided buffer completely, because of initial format, for example. The best way for testing environment is to abort program execution and extend the buffer needed to match all cases.
    • Fixed comparing signed with signed and vise versa.
    • Fixed broken resolver test.
    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Nov 17, 2014)

    Bug fixes

    • Fixed improper type mapping by name.

    When registering Cartesian product of all possible formatters and sinks with the factory, they are internally mapped into typeid structure to be able to extract proper type factory by its name or by user-defined mapper trait.

    Accidentally I've just forgot to write proper code for default case (mapping by entity name). Now the default type mapping checks whether type name is equal with the given one.

    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(Oct 29, 2014)

    Bug fixes

    • Fixed improper attributes routing.

    Accidentally all wrapper-attached attributes were routed to the internal section, which contain only internal attributes, like timestamp, severity or message.

    Internal attributes are not shown in variadic placeholders, but all user-defined attributes should.

    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Oct 28, 2014)

    Features

    • String formatter now has optional placeholder, which can be fully ignored by the library, when it's not present in a record.
    • String formatter now can be configured with prefix, suffix and separator while using optional or variadic placeholders.
    • String formatter has learned some convenient error-handling magic and can tell the User where and what type of error has happened.
    • It's now possible to represent time value structure in local timezone.
    • Any logger-compatible type (based on logger_base_t) can be created through a repository.
    • Use compiler extension (cross-platform nonetheless) to check log message format correctness in compile time.
    • The library now widely uses deprecated attribute feature, which allows to reduce from version to version migration pain.

    Bug fixes

    • Process id attribute is back and its extraction is much cheaper.
    • Message attribute should no longer hangs out with external attributes.
    • Fixed typo in GCC 4.6 detection macro.

    API

    • Log record has been completely refactored (and documented).
    • Completely dropped all scope-specific stuff. Actually, there are three scopes left, but its management is fully incapsulated into the library.
    • Completely dropped blackhole::log::* namespace, because it's already the Logging Library.
    • Logger wrapper can now provide const reference to the underlying logger.
    • Dropped 'in situ' substitution mechanism for keyword attributes, because it is creepy and useless.
    • Base config objects now return const references instead of copying.

    Other

    • Allow to use '_' symbol in placeholder name.
    • Fixed compatibility with GCC 4.4, which emitted false-positive warning.
    • Attribute value holders are now comparable.
    • Frontend factory now has more convenient interface.
    • Blackhole should no longer propagate exception raised from boost::format, while formatting message string. Instead of this an exception reason will be printed as message.
    • Using specialized exception instead of more generic while parsing configuration object.
    • Added logger trait concept.
    • More forward declarations, which may be useful with compile time reducing.
    • A lot of documentation added.

    Performance

    • Pack feeder now has overload that accepts string literal, which allows to avoid unnecessary transformations.
    • Multiple attribute sets is aggregated into single view class, so attribute lookup is performed lazily when it is needed by someone.
    • String formatter now internally uses ADT instead of packed functions.
    • Accelerated variadic placeholder handling in string formatter by approximately 30% via avoiding unnecessary string transformations.

    Testing

    • A log of unit tests added as like as benchmarks.
    Source code(tar.gz)
    Source code(zip)
  • v0.2.3(Oct 16, 2014)

  • v0.2.2(Sep 24, 2014)

  • v0.2.1(Sep 24, 2014)

  • v0.2.0(Aug 18, 2014)

    Features

    • Elasticsearch sink - allows to send logging events directly to that storage.
    • Scoped attributes holder - automatically adds specified attributes to the logger while in its scope.
    • Logger adaptor - keeps some attributes until lives.
    • Tracing framework - closely integrates with the logging system.
    • Configuration parser can properly handle arrays.
    • Logger frontends are now thread-aware.
    • Streaming sink now allows to use custom std::stream.
    • Logger object's internal state is now thread-safe.
    • Added default severity and its mapping function.

    Bug fixes

    • Long and unsigned long values can now be used as attributes.
    • Fixed misleading error message when failed to instantiate formatter.
    • Fixed undefined behaviour in syslog sink.
    • Some conditional memory jumps fixed.
    • TCP write handler will now block until the message is completely sent.
    • Fixed deadlock while invoking move assigning in logger wrapper.
    • Forgotten configuration include added.
    • Fixed mapping of debug severity to string.

    Other

    • Changed license to MIT.
    • Relax local attributes transition to the record.
    • Opening verbose logger's level type.
    • Added macro variable to determine if the platform has c++11 random library.
    • Start using implementation files (ipp), which allows to build library in the future.
    • Verbose logger now can keep bound verbosity level and filter by it.
    • No longer use boost::filesystem deprecated API.
    • Let the compiler deduce swap function it needs to use.
    • Migrated from boost::any to boost::variant configuration.
    • More forwards added.
    • Disable trace collecting by default.
    • Use lightweight process id (LWP) on Linux instead of thread id.
    • Logger can now provide its tracking state outside.
    • Moving BLACKHOLE_HEADER_ONLY declaration to the config file.
    • Disable tests and examples by default.
    • Logger wrapper's constructor overload now accepts other const wrapper's reference instead of non-const one.
    • Changed namespace of DECLARE_EVENT_KEYWORD.
    • Using new benchmarking framework for regression tests.
    • Default mapping from default severity to syslog one.
    • Default warning severity mapping to string has been slightly changed.
    • Change priority of attribute sets while merging.
    • Scoped attributes constructor now has more strictly wrapper concept check.
    • Added DECLARE_LOCAL_KEYWORD macro.

    Examples

    • Added example using Elasticsearch sink.

    Testing

    • Testing frameworks are now included as submodules.
    • Continious integration is used more widely, tests and examples should now be built separately.
    • Benchmark added to measure full logger event lifecycle.
    • Open access to backend variables for mocking purpose.
    • More tests for wrapper.
    • Added datetime generator, string formatter and other benchmarks.
    • Added tests to check priority of categorized attribute sets.
    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Apr 30, 2014)

Owner
Evgeny Safronov
ex-@yandex, now @sonm-io
Evgeny Safronov
Reckless logging. Low-latency, high-throughput, asynchronous logging library for C++.

Introduction Reckless is an extremely low-latency, high-throughput logging library. It was created because I needed to perform extensive diagnostic lo

Mattias Flodin 445 Dec 20, 2022
Colorful Logging is a simple and efficient library allowing for logging and benchmarking.

Colorful-Logging "Colorful Logging" is a library allowing for simple and efficient logging as well for benchmarking. What can you use it for? -Obvious

Mateusz Antkiewicz 1 Feb 17, 2022
A lightweight C++ logging library

Loguru: a lightweight and flexible C++ logging library. At a glance Documentation Documentation can be found at https://emilk.github.io/loguru/index.h

Emil Ernerfeldt 1.5k Jan 7, 2023
Portable, simple and extensible C++ logging library

Plog - portable, simple and extensible C++ logging library Pretty powerful logging library in about 1000 lines of code Introduction Hello log! Feature

Sergey Podobry 1.6k Dec 29, 2022
Fast C++ logging library.

spdlog Very fast, header-only/compiled, C++ logging library. Install Header only version Copy the source folder to your build tree and use a C++11 com

Gabi Melman 16.6k Jan 1, 2023
Asynchronous Low Latency C++ Logging Library

Quill Asynchronous Low Latency C++ Logging Library Introduction Features Performance Supported Platforms And Compilers Basic Usage CMake Integration D

Odysseas Georgoudis 677 Dec 20, 2022
Cute Log is a C++ Library that competes to be a unique logging tool.

Cute Log Cute Log is a C++ Library that competes to be a unique logging tool. Version: 2 Installation Click "Code" on the main repo page (This one.).

null 3 Oct 13, 2022
fmtlog is a performant fmtlib-style logging library with latency in nanoseconds.

fmtlog fmtlog is a performant asynchronous logging library using fmt library format. Features Faster - lower runtime latency than NanoLog and higher t

Meng Rao 443 Jan 6, 2023
Minimalistic logging library with threads and manual callstacks

Minimalistic logging library with threads and manual callstacks

Sergey Kosarevsky 20 Dec 5, 2022
A Fast and Convenient C++ Logging Library for Low-latency or Real-time Environments

xtr What is it? XTR is a C++ logging library aimed at applications with low-latency or real-time requirements. The cost of log statements is minimised

null 10 Jul 17, 2022
logog is a portable C++ library to facilitate logging of real-time events in performance-oriented applications

logog is a portable C++ library to facilitate logging of real-time events in performance-oriented applications, such as games. It is especially appropriate for projects that have constrained memory and constrained CPU requirements.

John Byrd 46 Oct 21, 2020
Boost Logging library

Boost.Log, part of collection of the Boost C++ Libraries, provides tools for adding logging to libraries and applications. Directories build - Boost.L

Boost.org 157 Dec 22, 2022
C++ implementation of the Google logging module

Google Logging Library The Google Logging Library (glog) implements application-level logging. The library provides logging APIs based on C++-style st

Google 5.9k Jan 9, 2023
log4cplus is a simple to use C++ logging API providing thread-safe, flexible, and arbitrarily granular control over log management and configuration. It is modelled after the Java log4j API.

% log4cplus README Short Description log4cplus is a simple to use C++17 logging API providing thread--safe, flexible, and arbitrarily granular control

null 1.4k Jan 4, 2023
Uberlog - Cross platform multi-process C++ logging system

uberlog uberlog is a cross platform C++ logging system that is: Small Fast Robust Runs on Linux, Windows, OSX MIT License Small Two headers, and three

IMQS Software 15 Sep 29, 2022
Reckless logging. Low-latency, high-throughput, asynchronous logging library for C++.

Introduction Reckless is an extremely low-latency, high-throughput logging library. It was created because I needed to perform extensive diagnostic lo

Mattias Flodin 445 Dec 20, 2022