标签: boost-log

使用date_time_formatter时,使用Boost日志库进行编译错误

我正在尝试使用Boost日志库,我想在输出中添加时间戳.我从这个例子开始,但我遇到了编译错误.我完全按照示例复制了代码,并将init()函数更改为第二个(example_tutorial_formatters_stream_date_time).现在我有以下编译错误:

$ g++ -Wall -Wextra -O0 -g -isystem /proj/cudbdm/tools/external/boost/inst_1_54_0_cxx11/include -c main.cpp -o main.o
In file included from /proj/cudbdm/tools/external/boost/inst_1_54_0_cxx11/include/boost/log/expressions/formatters.hpp:23:0,
                 from /proj/cudbdm/tools/external/boost/inst_1_54_0_cxx11/include/boost/log/expressions.hpp:26,
                 from main.cpp:109:
/proj/cudbdm/tools/external/boost/inst_1_54_0_cxx11/include/boost/log/expressions/formatters/date_time.hpp: In instantiation of 'boost::log::v2s_mt_posix::expressions::format_date_time_terminal<T, FallbackPolicyT, CharT>::format_date_time_terminal(const boost::log::v2s_mt_posix::attribute_name&, const fallback_policy&, const string_type&) [with T = boost::posix_time::ptime; FallbackPolicyT = boost::log::v2s_mt_posix::fallback_to_none; CharT = char; boost::log::v2s_mt_posix::expressions::format_date_time_terminal<T, FallbackPolicyT, CharT>::fallback_policy = boost::log::v2s_mt_posix::fallback_to_none; boost::log::v2s_mt_posix::expressions::format_date_time_terminal<T, FallbackPolicyT, CharT>::string_type = std::basic_string<char>]':
/proj/cudbdm/tools/external/boost/inst_1_54_0_cxx11/include/boost/log/expressions/formatters/date_time.hpp:229:94:   required from 'boost::log::v2s_mt_posix::expressions::format_date_time_actor<AttributeValueT, boost::log::v2s_mt_posix::fallback_to_none, CharT> boost::log::v2s_mt_posix::expressions::format_date_time(const boost::log::v2s_mt_posix::attribute_name&, const CharT*) [with AttributeValueT = boost::posix_time::ptime; CharT = char]'
main.cpp:156:103:   required from here
/proj/cudbdm/tools/external/boost/inst_1_54_0_cxx11/include/boost/log/expressions/formatters/date_time.hpp:94:68: …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-log

10
推荐指数
1
解决办法
2244
查看次数

显式检查boost :: log过滤器?

我有一些琐碎的日志记录:

BOOST_LOG_TRIVIAL(trace) << make_trace_record();
Run Code Online (Sandbox Code Playgroud)

现在make_trace_record是一个有点贵的功能(不要问为什么,这很复杂).我只想在日志当前通过过滤时调用它.我怎样才能做到这一点?我没有看到明确调用严重性过滤器的方法.

c++ boost boost-log c++11

10
推荐指数
1
解决办法
222
查看次数

如何在boost log 2.0中记录编码器的行号?

我可以使用LineID属性吗?我希望我可以使用sink :: set_formatter来执行此操作而不是使用

__LINE__
Run Code Online (Sandbox Code Playgroud)

__FILE__
Run Code Online (Sandbox Code Playgroud)

在每个日志语句中.

boost-log

9
推荐指数
3
解决办法
3158
查看次数

如何在fork上重新初始化Boost日志库?

Boost.Log不支持fork().这有点令人难以置信,但机票评论描述了一种解决方法:

[..]所以现在由用户在fork上重新初始化库.您可以使用pthread_atfork进行此类重新初始化.

因此我的问题是:如何在fork()之后重新初始化Boost.Log?

代码示例非常感谢.

c++ logging boost fork boost-log

8
推荐指数
1
解决办法
362
查看次数

Boost Log运行时优化

我正在为我的应用程序的日志记录平台使用Boost-Log和全局严重性记录器.分析表明,boost::log::v2s_mt_posix::core::open_record最多可占用总执行时间的25%.

我确实有很多日志消息,但我不希望它们如此昂贵,因为它们的严重性较低,而且它们被过滤掉了.

有没有办法让这些消息在运行时不那么昂贵?(再次:我希望即使在过滤时也会有一个小的开销,当然,当没有过滤时,它会更大).

通过创建一些包装器宏,编译时相对容易"修复".

更新样本工作代码:

#include <cmath>
#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/log/sources/global_logger_storage.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/sources/severity_channel_logger.hpp>
#include <boost/log/common.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/utility/empty_deleter.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

// severity levels
enum severity_level {INFO};

// 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 …
Run Code Online (Sandbox Code Playgroud)

c++ logging boost boost-log

8
推荐指数
1
解决办法
1330
查看次数

如何使用boost.log以dec格式打印ProcessID和ThreadID

我在我的程序中使用boost.log,默认格式化程序以十六进制格式输出ProcessID和ThreadID,任何人都知道如何以dec格式打印它们,谢谢.

这是我的代码的github:https://github.com/owenliang/boost_asio,谢谢.

  boost::log::formatter scope_formatter = boost::log::expressions::stream << "[" <<
      boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S") <<
      "] [" << boost::log::expressions::attr<boost::log::attributes::current_process_id::value_type>("ProcessID") << 
      "-" << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID") << "] [" <<
      boost::log::expressions::attr<boost::log::trivial::severity_level>("Severity") <<
      "] " << boost::log::expressions::format_named_scope("Scope", boost::log::keywords::format = "%c[%F:%l] ", 
        boost::log::keywords::depth = 1) << boost::log::expressions::smessage;
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-log

8
推荐指数
1
解决办法
1658
查看次数

Boost.Log无法设置日志记录过滤器(未声明标识符'严重性')

我正试图让Boost.Log进入我的项目.问题来自以下简单示例:

using namespace boost::log;
core::get()->set_filter
(
    trivial::severity >= trivial::info
);
Run Code Online (Sandbox Code Playgroud)

在我的代码中,这转换为以下内容:

boost::log::core::get()->set_filter(
  boost::log::trivial::severity >= boost::log::trivial::info
);
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

error C2039: 'severity' : is not a member of 'boost::log::v2s_mt_nt5::trivial'
error C2065: 'severity' : undeclared identifier
Run Code Online (Sandbox Code Playgroud)

我正在搜索名称空间,试图找出我应该如何做到这一点,但我并没有找到任何有用的东西.看来这是一个疯狂的lambda功能.我有一些替代方案(定义一个填充过滤级别的函数?),但我不知道如何实现这一点.有任何想法吗?

我正在使用Boost.Log版本2.0-r862和Boost 1.53.0.

解决方案:瑞安指出,我应该检查我包括,果然我只是包括trivial.hpp,但core.hppexpressions.hpp还需要为包括.包括他们解决了这个问题.

// need at least these 3 to get "trivial" to work
#include <boost/log/core.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/trivial.hpp>
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-log

7
推荐指数
1
解决办法
2636
查看次数

重载<<运算符以提升日志记录对象

所以我想使用Boost.Log进行所有日志记录.我目前编写了一个包含实例化和设置辅助方法所需的所有操作的类.

问题是我想重载<<运算符以cout方式使用它.我希望能够使用它来使不同的参数类型似乎是最大的问题.

这是我试过的:

template <typename T>
void trace::operator <<(T data)
{
    std::string text=boost::lexical_cast<std::string>(data);
    std::cout<<data<<std::endl;
    BOOST_LOG_TRIVIAL(debug) << text;
}
Run Code Online (Sandbox Code Playgroud)

但是,据我所知,这在逻辑上有点瑕疵.为了能够将多个args传递给<<它需要递归.但我有点困惑如何用升压日志来做这件事.

我是否必须使用自定义接收器而不是方便的boost宏来定义日志系统?如果是这样支持std :: ostream返回?我猜这将是返回值和流中的输入值.

c++ boost boost-logging boost-log

7
推荐指数
1
解决办法
1624
查看次数

libboost_log_setup.a库的原因?

在最新的Boost 1.54版本中,我看到了Boost.Log库.当我编译整个Boost 1.54时,我发现对于Log库,它产生了2个二进制文件:

  • libboost_log.a
  • libboost_log_setup.a

libboost_log_setup.a图书馆的原因是什么?我什么时候应该链接它?

c++ boost boost-log

7
推荐指数
1
解决办法
1120
查看次数

Boost Log的琐碎记录器的"懒惰评估"如何工作?

[ 跟进检查boost :: log过滤器明确? ]

以下示例使用Boost Log中的普通记录器.它输出1,显示expensive()只调用一次.它是如何工作的?为什么expensive()不叫?

Live On Coliru

#include <iostream>

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

int count = 0;

int expensive()
{
    return ++count;
}

int main()
{
    boost::log::core::get()->set_filter(
        boost::log::trivial::severity >= boost::log::trivial::warning
    );

    BOOST_LOG_TRIVIAL(error) << expensive();
    BOOST_LOG_TRIVIAL(info) << expensive();

    std::cout << count << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

[2018-05-21 14:33:47.327507] [0x00007eff37aa1740] [error]   1
1
Run Code Online (Sandbox Code Playgroud)

c++ boost lazy-evaluation boost-log

7
推荐指数
1
解决办法
310
查看次数

标签 统计

boost-log ×10

boost ×9

c++ ×9

logging ×2

boost-logging ×1

c++11 ×1

fork ×1

lazy-evaluation ×1