我正在尝试使用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) 我有一些琐碎的日志记录:
BOOST_LOG_TRIVIAL(trace) << make_trace_record();
Run Code Online (Sandbox Code Playgroud)
现在make_trace_record
是一个有点贵的功能(不要问为什么,这很复杂).我只想在日志当前通过过滤时调用它.我怎样才能做到这一点?我没有看到明确调用严重性过滤器的方法.
我可以使用LineID属性吗?我希望我可以使用sink :: set_formatter来执行此操作而不是使用
__LINE__
Run Code Online (Sandbox Code Playgroud)
和
__FILE__
Run Code Online (Sandbox Code Playgroud)
在每个日志语句中.
Boost.Log不支持fork().这有点令人难以置信,但机票评论描述了一种解决方法:
[..]所以现在由用户在fork上重新初始化库.您可以使用pthread_atfork进行此类重新初始化.
因此我的问题是:如何在fork()之后重新初始化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) 我在我的程序中使用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) 我正试图让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.hpp
并expressions.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) 所以我想使用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返回?我猜这将是返回值和流中的输入值.
在最新的Boost 1.54版本中,我看到了Boost.Log库.当我编译整个Boost 1.54时,我发现对于Log库,它产生了2个二进制文件:
libboost_log_setup.a
图书馆的原因是什么?我什么时候应该链接它?
[ 跟进检查boost :: log过滤器明确? ]
以下示例使用Boost Log中的普通记录器.它输出1
,显示expensive()
只调用一次.它是如何工作的?为什么expensive()
不叫?
#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)