2017-05-02 2 views
3

Ich möchte nur eine Funktion zum Schreiben von Protokollen, die Ellipsen analysieren und senden Ergebnis an die Boost :: log, basierend auf Schweregrad. In der Header-Datei würden verschiedene Makros definiert, die einen korrekten Schweregrad auswählen würden. Es ist der Code:C++ Pass Boost :: Protokoll Schweregrad als Argument zur Funktion

#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 

#define DEBUG(msg, ...)   Logger::write_log(debug, msg, ##__VA_ARGS__); 
#define INFO(msg, ...)   Logger::write_log(info, msg, ##__VA_ARGS__); 
#define WARNING(msg, ...)  Logger::write_log(warning, msg, ##__VA_ARGS__); 
#define ERROR(msg, ...)   Logger::write_log(error, msg, ##__VA_ARGS__); 

namespace logging = boost::log; 

void write_log(auto level, const char *message, ...) 
{ 
    char buffer[512]; 
    va_list args; 

    // Parse ellipsis and add arguments to message 
    va_start (args, message); 
    vsnprintf (buffer, sizeof(buffer), message, args); 
    va_end (args); 

    BOOST_LOG_TRIVIAL(level) << buffer; 
} 

int main(int argc, char** argv) 
{ 
    DEBUG("Test string %s", "additional string"); 

    return 0; 
} 

Aber während der Kompilierung bekomme ich den nächsten Fehler:

error: 'level' is not a member of 'boost::log::v2s_mt_nt5::trivial' 
     BOOST_LOG_TRIVIAL(level) << buffer; 

Es scheint, dass mein Niveau Argument einen falschen Typ. Ich habe auch versucht, logging::trivial::severity_level level anstelle von auto level zu verwenden, aber das hat nicht geholfen. Wie kann ich diesen Fehler beheben?

AKTUALISIERT:

dort Lösung arbeitet:

#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 

#define DEBUG(msg, ...)   Logger::write_log(debug, msg, ##__VA_ARGS__); 
#define INFO(msg, ...)   Logger::write_log(info, msg, ##__VA_ARGS__); 
#define WARNING(msg, ...)  Logger::write_log(warning, msg, ##__VA_ARGS__); 
#define ERROR(msg, ...)   Logger::write_log(error, msg, ##__VA_ARGS__); 

namespace logging = boost::log; 

enum severity_level 
{ 
    debug, 
    info, 
    warning, 
    error, 
    exception 
}; 
src::severity_logger<severity_level> slg; 

void write_log(severity_level level, const char *message, ...) 
{ 
    char buffer[512]; 
    va_list args; 

    // Parse ellipsis and add arguments to message 
    va_start (args, message); 
    vsnprintf (buffer, sizeof(buffer), message, args); 
    va_end (args); 

    BOOST_LOG_SEV(slg, level) << buffer; 
} 

int main(int argc, char** argv) 
{ 
    DEBUG("Test string %s", "additional string"); 

    return 0; 
} 
+0

BOOST_LOG_TRIVIAL akzeptiert keine Variable, sie benötigt eine der vordefinierten Pegelkonstanten. –

Antwort

1

boost log example Folgen und definieren:

// severity levels 
enum severity_level 
{ 
    trace, 
    debug, 
    info, 
    warning, 
    error, 
    fatal 
}; 

Und Sie müssen Ihre Funktion akzeptieren richtige Art machen:

void write_log(severity_level level, const char *message, ...){ ... } 

Eine andere Option:

#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 

#define DEBUG(msg, ...)   Logger::write_log(logging::trivial::debug, msg, ##__VA_ARGS__); 
#define INFO(msg, ...)   Logger::write_log(logging::trivial::info, msg, ##__VA_ARGS__); 
#define WARNING(msg, ...)  Logger::write_log(logging::trivial::warning, msg, ##__VA_ARGS__); 
#define ERROR(msg, ...)   Logger::write_log(logging::trivial::error, msg, ##__VA_ARGS__); 

namespace logging = boost::log; 

#define LOG_TRIVIAL(lvl)\ 
    BOOST_LOG_STREAM_WITH_PARAMS(::boost::log::trivial::logger::get(),\ 
     (::boost::log::keywords::severity = lvl)) 

void write_log(logging::trivial::severity_level level, const char *message, ...) 
{ 
    char buffer[512]; 
    va_list args; 

    // Parse ellipsis and add arguments to message 
    va_start(args, message); 
    vsnprintf(buffer, sizeof(buffer), message, args); 
    va_end(args); 

    LOG_TRIVIAL(level) << buffer; 
} 

int main(int argc, char** argv) 
{ 
    DEBUG("Test string %s", "additional string"); 

    return 0; 
} 
1

Mein Rat: Ihre eigene Schwere erstellen. Es ist nur ein Enum! Folgen Sie dem Quellcode dieser "Ebene" (mit Ihrer IDE), um zu sehen, dass es eine einfache Enum ist. Kopieren Sie es in Ihre Implementierung und ändern Sie es bei Bedarf. Dies ist how it looks (nach seinem Namen zu ändern):

enum my_severity_level 
{ 
    trace, 
    debug, 
    info, 
    warning, 
    error, 
    fatal 
}; 

treffen, um Ihren Code, und verwenden Sie es als notwendig.

Das write_log Funktion sollte wie folgt sein:

void write_log(my_severity_level level, const char *message, ...) { ... }