Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Boost同时记录到控制台和文件_C++_Logging_Boost_Boost Log_Boost Logging - Fatal编程技术网

C++ 使用Boost同时记录到控制台和文件

C++ 使用Boost同时记录到控制台和文件,c++,logging,boost,boost-log,boost-logging,C++,Logging,Boost,Boost Log,Boost Logging,我需要帮助来初始化boost日志框架,以便同时登录到命名日志文件和控制台-(命名日志文件不需要定期旋转,也不需要根据许多boost教程进行任何类似的设置) 日志文本应该同时发送到两个接收器,但是我需要稍微改变控制台输出的格式(因为它将由用户查看)。我能够使用获得记录到两个单独接收器的基本信息。对于我需要做的事情来说,它过于复杂,而且就访问适当的记录器而言,它确实令人困惑。我所需要做的就是将带有时间戳的消息发送到日志文件,并将相同的信息发送到控制台日志,而不使用发送到控制台日志的时间戳或换行符(只

我需要帮助来初始化boost日志框架,以便同时登录到命名日志文件和控制台-(命名日志文件不需要定期旋转,也不需要根据许多boost教程进行任何类似的设置)


日志文本应该同时发送到两个接收器,但是我需要稍微改变控制台输出的格式(因为它将由用户查看)。我能够使用获得记录到两个单独接收器的基本信息。对于我需要做的事情来说,它过于复杂,而且就访问适当的记录器而言,它确实令人困惑。我所需要做的就是将带有时间戳的消息发送到日志文件,并将相同的信息发送到控制台日志,而不使用发送到控制台日志的时间戳或换行符(只显式地放入新行,就像我通常使用
时所做的那样。下面是一些使用Boost日志全局记录器的示例代码。我调用
init_term()
初始化终端记录器和初始化日志文件()

注意
自动刷新(true)
调用

// Logging macro
#define LOG(level) BOOST_LOG_SEV(global_logger::get(), level)
// Initializing global boost::log logger
typedef boost::log::sources::severity_channel_logger_mt<
    severity_level, std::string> global_logger_type;

BOOST_LOG_INLINE_GLOBAL_LOGGER_INIT(global_logger, global_logger_type)
{
    return global_logger_type(boost::log::keywords::channel = "global_logger");
}

// Initialize terminal logger
void init_term()
{
    // create sink to stdout
    boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
    sink->locked_backend()->add_stream(
        boost::shared_ptr<std::ostream>(&out, boost::empty_deleter()));

    // flush
    sink->locked_backend()->auto_flush(true);

    // format sink
    sink->set_formatter
    (
        /// TODO add your desired formatting
    );

    // filter
    // TODO add any filters

    // register sink
    bl::core::get()->add_sink(sink);
}

// Initialize logfile
void init_logfile(const std::string& logfilename)
{
    // create sink to logfile
    boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
    sink->locked_backend()->add_stream(
        boost::make_shared<std::ofstream>(logfilename.c_str()));

    // flush
    sink->locked_backend()->auto_flush(true);

    // format sink
    sink->set_formatter
    (
        /// TODO add your desired formatting
    );

    // filter
    // TODO add any filters

    // register sink
    bl::core::get()->add_sink(sink);
}
//记录宏
#定义日志(级别)BOOST\u LOG\u SEV(全局日志记录器::get(),级别)
//正在初始化全局boost::日志记录器
typedef boost::log::sources::严重性\通道\记录器\ mt<
严重性级别,标准::字符串>全局类型;
BOOST_LOG_INLINE_GLOBAL_LOGGER_INIT(全局_LOGGER,全局_LOGGER_type)
{
返回全局日志记录器类型(boost::log::keywords::channel=“全局日志记录器”);
}
//初始化终端记录器
void init_term()
{
//创建接收器到标准输出
boost::shared_ptr sink=boost::make_shared();
接收器->锁定的\u后端()->添加\u流(
boost::shared_ptr(&out,boost::empty_deleter());
//冲洗
sink->locked_backend()->auto_flush(真);
//格式接收器
接收器->设置格式化程序
(
///TODO添加所需格式
);
//滤器
//TODO添加任何筛选器
//寄存器接收器
bl::core::get()->添加_接收器(接收器);
}
//初始化日志文件
void init_日志文件(const std::string和logfilename)
{
//创建日志文件的接收器
boost::shared_ptr sink=boost::make_shared();
接收器->锁定的\u后端()->添加\u流(
boost::make_shared(logfilename.c_str());
//冲洗
sink->locked_backend()->auto_flush(真);
//格式接收器
接收器->设置格式化程序
(
///TODO添加所需格式
);
//滤器
//TODO添加任何筛选器
//寄存器接收器
bl::core::get()->添加_接收器(接收器);
}

Dimitris,谢谢,你有相关的#includes和名称空间别名吗。另外我忘了提到我正在为Visual Studio 2013开发,我倾向于通过#pragma警告(disable:4510 4610)(包装在#pragma警告(push/pop)中)得到大量需要抑制的警告-但我仍然收到很多警告。事实上,我刚刚找到了如何通过“Boost Log run-time optimization”进行编译的方法,我对此进行了投票。非常有用。关于自动刷新,这对我的日志文件并不重要,但对终端来说很重要。事实上,我将有两个单独的日志文件(用于不同的日志记录目的-实际上是3个日志接收器-2个文件和一个控制台)-我无法理解的是如何获取日志(“某物”)将其输出定向到适当的目标输出。我认为这与过滤器有关,但这并不明显,我相信我需要某种属性来help@johnco3,我认为解决办法在于过滤器。如果你想
LOG(LEVEL)
要先写入特定接收器,需要将
严重性级别
传递给所有不希望其存在的接收器初始化函数,然后对其进行过滤,例如
sink->set\u filter(boost::log::expressions::attr(“严重性”)==level)
我同意,昨天,我从头开始编写了一个Logger类,试图解决这个问题,但取得了部分成功-使用多通道记录器。Logger类3通道记录器成员使用通道名称初始化。代码非常类似于:ttps://github.com/boostorg/log/blob/master/example/doc/sources_net_connection_dynamic_chan.cpp 让我困惑的是,为什么有必要在第33行调用BOOST_LOG_ATTRIBUTE_关键字(channel,“channel”,std::string)——我认为channel是与通道记录器关联的预定义属性。
// Logging macro
#define LOG(level) BOOST_LOG_SEV(global_logger::get(), level)
// Initializing global boost::log logger
typedef boost::log::sources::severity_channel_logger_mt<
    severity_level, std::string> global_logger_type;

BOOST_LOG_INLINE_GLOBAL_LOGGER_INIT(global_logger, global_logger_type)
{
    return global_logger_type(boost::log::keywords::channel = "global_logger");
}

// Initialize terminal logger
void init_term()
{
    // create sink to stdout
    boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
    sink->locked_backend()->add_stream(
        boost::shared_ptr<std::ostream>(&out, boost::empty_deleter()));

    // flush
    sink->locked_backend()->auto_flush(true);

    // format sink
    sink->set_formatter
    (
        /// TODO add your desired formatting
    );

    // filter
    // TODO add any filters

    // register sink
    bl::core::get()->add_sink(sink);
}

// Initialize logfile
void init_logfile(const std::string& logfilename)
{
    // create sink to logfile
    boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
    sink->locked_backend()->add_stream(
        boost::make_shared<std::ofstream>(logfilename.c_str()));

    // flush
    sink->locked_backend()->auto_flush(true);

    // format sink
    sink->set_formatter
    (
        /// TODO add your desired formatting
    );

    // filter
    // TODO add any filters

    // register sink
    bl::core::get()->add_sink(sink);
}