我有一个宏看起来如下(来自升级日志库)
#define L_(lvl) BOOST_LOG_USE_LOG_IF_LEVEL(g_l(), g_log_level(), lvl )
是否可以将其包装成boost :: function<>对象或函数指针并将其粘贴在这些项的队列或向量中?
如果是的话,我该怎么做?
我正在尝试编写一种机制,我有一个线程将所有日志记录写入日志文件,并且任何工作线程都需要能够记录到它,但是依赖于活动日志级别,我会只想记录配置为记录的内容。因此,我会为任何线程创建一个队列来对日志消息进行排队,然后使用专用线程将它们写入各自的文件,以便在需要大量日志记录时不会减慢程序的速度。我想使用boost :: log库,所以我必须使用这个宏,因为这会写入封面下的文件。
lvl
是您传递给此函数的日志级别。它的用途是:L_(debug) << "some log text";
答案 0 :(得分:1)
如果你有一组固定的日志记录级别,你可以从函数中调用该宏并使用指向该函数的指针:
void log() {
L_(3);
}
void anotherlog() {
L_(13);
}
你可以轻松地在向量中拥有它然后全部调用它们:
typedef void (*LogFunction)();
std::vector<LogFunction> logFunctions;
logFunctions.push_back( log );
logFunctions.push_back( anotherLog );
std::vector<LogFunction>::iterator it, end = logFunctions.end();
for ( it = logFunctions.begin(); it != end; ++it )
(*it)();
答案 1 :(得分:1)
struct LogFunction
{
LogFunction(int lvl) :lvl_(lvl) {}
TYPE operator () () { return L_(lvl_); }
// Where "TYPE" is whatever type L_ returns
private:
int lvl_;
};
答案 2 :(得分:1)
有没有理由不能使用专用线程编写器的Boost实现?
typedef logger_format_write< default_, default_, writer::threading::on_dedicated_thread > logger_type;
答案 3 :(得分:0)
不,你不能把宏放在像这样的函数指针附近的任何地方。甚至不需要像这样的宏,你可以只使用面向对象的函数。
答案 4 :(得分:0)
void Log(int level)
{
L_(level);
}
typedef boost::function1<void, int> LogFunction;
std::vector< LogFunction > LogFunctionVector;
LogFunction L3 = Log(3);
LogFunction L5 = Log(5);
LogFunctionVector.push_back(L3);
LogFunctionVector.push_back(L5);