2017-05-02 5 views
3

重大度に基づいて、省略記号を解析して結果をBoost :: logに送信するログを書き込む関数を1つだけ持ちたいとします。ヘッダーファイルには異なるマクロが定義され、正しい重大度が選択されます。C++関数の引数としてBoost :: log重大度を渡す

#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; 
} 

しかし、コンパイル時に、私は次のエラーを取得する:そこコードがある

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

は私のレベルの引数が間違った型を持つようです。私もauto levelの代わりにlogging::trivial::severity_level levelを使用しようとしましたが、これは役に立たなかった。このエラーを修正するにはどうすればよいですか?

更新:解決策が働いている

#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は変数を受け入れません。あらかじめ定義されたレベル定数の1つが必要です。 –

答えて

1

フォローboost log exampleと定義:

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

そして、あなたは適切な型を受け入れるようにあなたの関数を作成する必要がありますが:

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

別のオプション:

#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

私のアドバイス:あなた自身の重症度を作成します。それはちょうどenumです!その "レベル"(IDEを使用)のソースコードに従って、簡単な列挙型であることを確認してください。実装にコピーし、必要に応じて変更します。これは、(その名前を変更した後)how it looksです:

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

はあなたのコードにそれを取り、必要に応じてそれを使用しています。

write_log機能は次のようにする必要があること:

void write_log(my_severity_level level, const char *message, ...) { ... } 
関連する問題