我正在使用C ++ Boost日志库(1.54)来为我的Windows应用程序进行日志记录。我已经定义了一个简单的类来设置日志宏和&获取一个Boost配置文件,该文件定义了我的应用程序的接收器。
LoggerClass.h
class LoggerClass {
public:
static void Initialization(const std::string& configurationFile)
}
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, boost::log::sources::severity_logger_mt<boost::log_trivial::severity_level>);
#define LOG_INFO_MESSAGE BOOST_LOG_SEV(my_logger::get(), boost::log::trivial::severity_level::info)
LoggerClass.cpp
void LoggerClass::Initialization(const std::string& configurationFile)
{
boost::log::register_simple_formatter_factory< boost::log::trivial::severity_level, char >("Severity");
boost::log::register_simple_filter_factory< boost::log::trivial::severity_level, char >("Severity");
boost::log::register_simple_formatter_factory< unsigned int, char >("Line");
boost::log::register_simple_filter_factory< unsigned int, char >("Line");
boost::log::register_formatter_factory("TimeStamp", boost::make_shared< time_formatter_factory >());
std::ifstream file(configurationFile);
boost::log::init_from_stream(file);
boost::log::add_common_attributes();
my_boost::get();
}
我的配置文件:
[Core]
DisableLogging=false
[Sinks.Sink1]
Destination=Console
Asynchronous=false
AutoFlush=true
如果我在设置任何接收器之前调用这些宏,则默认接收器将第一条消息写入STDOUT,就像它应该的那样。
int main(int argc, char* argv[] {
LOG_INFO_MESSAGE << "Before Initialization()"; //writes to STDOUT
LoggerClass::Initialization("log.conf"); //sets up the console sink
LOG_INFO_MESSAGE << "After Initialization()"; //writes to STDERR???
}
但是,一旦我在配置文件中定义了控制台接收器&amp;调用boost :: log :: init_from_stream()方法,所有消息都以STDERR结束,而不是像我期望的那样STDOUT。
C:\Test\TestLogger.exe > std.txt 2> err.txt
std.txt
[2014-05-08 12:57:17.293972] [0x00004b58] [info] Before Initialization()
err.txt
After Initialization()
设置控制台接收器后,为什么默认情况下消息不会转到STDOUT?
答案 0 :(得分:4)
根据Boost源头文件(Boost \ log \ utility \ setup \ console.hpp),Console logger写入std :: clog,它与C流STDERR相关联。