我正试图让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) 我在我的C++程序中使用boost log,并且我severity_logger< severity_level >
使用了我定义的severity_level枚举.然后我用格式字符串创建我的日志接收器,"%TimeStamp% [%ThreadID%] %Severity% %Module% - %Message%"
但它没有显示我所拥有的严重性,%Severity%
而是在该位置只是空白.例如,2013-07-29 10:31 [0xDEADBEEF] my.Module - Hello World
.我需要在格式字符串中执行哪些操作才能显示严重性级别?
这是我的代码的一部分:
#define NUM_SEVERITY_LEVELS 6
enum severity_level
{
// These are deliberately the same levels that log4j uses
trace = 0,
debug = 1,
info = 2,
warning = 3,
error = 4,
fatal = 5
};
typedef src::severity_logger< severity_level > logger_t;
const char* severity_level_str[NUM_SEVERITY_LEVELS] = {
"TRACE",
"DEBUG",
"INFO",
"WARNING",
"ERROR",
"FATAL"
};
template< typename CharT, typename …
Run Code Online (Sandbox Code Playgroud) 我boost::log
在这个函数中使用:
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/utility/setup/file.hpp>
void InitLog() {
logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::debug);
logging::add_file_log(
keywords::file_name = AppHolder::Instance().config().log_folder + "/sign_%Y-%m-%d_%H-%M-%S.%N.log",
keywords::rotation_size = 10 * 1024 * 1024,
keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
keywords::format = "%TimeStamp% (%LineID%) <%Severity%>: %Message%"
);
}
Run Code Online (Sandbox Code Playgroud)
然后,给出电话:
BOOST_LOG_TRIVIAL(info) << "thread id: " << this_thread::get_id() << " Initialization succeeded";
Run Code Online (Sandbox Code Playgroud)
输出不符合预期:时间戳,行ID和严重性为空.
()<>:线程ID:7f58e30e8740初始化成功
我已boost::log
成功使用stdout(使用TRIVIAL
宏)或登录到文件(基本上按照教程中的步骤).
我们如何配置同时登录文件和标准输出?
当我们想要同时拥有日志文件以及进入控制台日志的所有输出时,这是我们设置中的常见用例.
任何输入赞赏!
我试图将Boost.Log集成到一个相当大的应用程序中,该应用程序由一个动态加载DLL插件的主应用程序组成.最初的想法是将日志源传递给插件,以便他们可以添加日志消息.但是,只要DLL中的代码尝试将消息记录到提供的源,应用程序就会因访问冲突而崩溃.
以下最小示例说明了此问题:
int main(int argc, char* argv[])
{
boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> logger;
// This is okay
BOOST_LOG_SEV(logger, boost::log::trivial::info) << "From main()";
// This crashes
logFromDll(logger);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在logFromDll
单独的(DLL)项目中定义的位置:
Dll.cpp
TESTDLL_API void logFromDll(boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> &logger)
{
BOOST_LOG_SEV(logger, boost::log::trivial::info) << "From dll";
}
Run Code Online (Sandbox Code Playgroud)
如上所述,这会在访问冲突中崩溃logFromDll
(使用visual studio 2010编译).
Boost.Log为日志源的"全局存储"提供了一种机制:
声明了全局记录器后,可以确保从应用程序代码的任何位置对此记录器实例进行线程安全访问.该库还保证全局记录器实例即使跨模块边界也是唯一的.
听起来和我需要的完全一样.所以我设置了以下示例:
Logger.h
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level>)
Run Code Online (Sandbox Code Playgroud)
Main.cpp的
int main(int argc, char* argv[])
{
boost::log::add_console_log
(
std::clog,
boost::log::keywords::format =
(
boost::log::expressions::stream << "[Custom format] " << boost::log::expressions::smessage …
Run Code Online (Sandbox Code Playgroud) 我使用该add_file_log()
函数初始化将日志记录存储到文本文件中的日志记录接收器.当我定义几个接收器时,我观察到:
这是我的记录器:
class logger
{
public:
logger(const logger&) =delete;
logger(logger&&) =delete;
logger& operator=(const logger&) =delete;
logger& operator=(logger&&) =delete;
static logger& get_instance(
const std::string& file,
bool console
)
{
boost::log::register_simple_formatter_factory<
boost::log::trivial::severity_level,
char
>("Severity");
std::string the_format = "[%TimeStamp%] (%LineID%) [%Severity%]: %Message%";
if(!file.empty()) {
boost::log::add_file_log(
boost::log::keywords::file_name = file + "_%N.log",
boost::log::keywords::rotation_size = 10 * 1024 * 1024,
boost::log::keywords::time_based_rotation =
boost::log::sinks::file::rotation_at_time_point(0, 0, 0),
boost::log::keywords::auto_flush = true,
//boost::log::keywords::open_mode = (std::ios::out | std::ios::app),
boost::log::keywords::format = the_format
);
}
boost::log::add_common_attributes();
static logger instance{ …
Run Code Online (Sandbox Code Playgroud) 我目前正在评估一些非托管C++的日志框架.
我的问题是:Boost.Log和Boost.Log v2有什么区别?
Api是不同的?在项目中使用Boost.Log v2是否安全,还是应该坚持使用Boost.Log 1.1?
何时被Boost接受?它可能在未来遭受重大变化?
假设我有一个简单的boost.log severity_logger
记录器设置如下:
logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::debug);
logging::add_common_attributes();
src::severity_logger< logging::trivial::severity_level > logger;
Run Code Online (Sandbox Code Playgroud)
如何以编程方式检查严重性?
有点像logger.getSeverity()
..?
我已经在StackOverflow上筛选了文档和其他问题但是却找不到应该是一个简单的API调用..?
以下代码与boost 1.57一样正常工作:
#include <iostream>
#include <boost/log/trivial.hpp>
struct Foo
{
int d=1;
};
std::ostream& operator<<(std::ostream& out, const Foo& foo)
{
out << "Foo: " << foo.d;
return out;
}
int main()
{
BOOST_LOG_TRIVIAL(info) << Foo();
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
使用boost 1.59相同的代码失败.第一个gcc错误消息是:
错误:'operator <<'不匹配(操作数类型为'boost :: log :: v2s_mt_posix :: basic_record_ostream'和'Foo')
文档和发行说明均未记录需要更改的内容.
静态链接 Boost.Log 时出现链接错误。编译器版本是g++ 4.8.1。Boost版本是1.55.0。我可以毫无问题地进行动态链接(在 make 文件中使用“-DBOOST_LOG_DYN_LINK”),但是当我进行静态链接时,会出现链接错误。在其他 boost 库上不会出现此问题。我简化了代码以轻松重现此问题:
#include <boost/log/trivial.hpp>
int main()
{
BOOST_LOG_TRIVIAL(trace) << "test trace";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
生成链接错误的构建命令:
g++ test.cpp -lboost_thread -lboost_log
Run Code Online (Sandbox Code Playgroud)
但是,如果我明确指定 lib 文件,就不会有问题:
g++ test.cpp -lboost_thread /usr/local/lib/libboost_log.a
Run Code Online (Sandbox Code Playgroud)
我还尝试添加 -L 选项并得到相同的错误:
g++ test.cpp -L/usr/local/lib -lboost_thread -lboost_log
Run Code Online (Sandbox Code Playgroud)
这是错误日志:
test.cpp:(.text+0x29): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
test.cpp:(.text+0x70): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
/tmp/ccDUZ2gm.o: In function `boost::log::v2s_mt_posix::record::reset()':
test.cpp:(.text._ZN5boost3log12v2s_mt_posix6record5resetEv[_ZN5boost3log12v2s_mt_posix6record5resetEv]+0x23): undefined reference to `boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)'
/tmp/ccDUZ2gm.o: In function `boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_composite_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex>, boost::log::v2s_mt_posix::sources::features<boost::log::v2s_mt_posix::sources::severity<boost::log::v2s_mt_posix::trivial::severity_level>, void, void, void, void, void, void, void, void, void> >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level …
Run Code Online (Sandbox Code Playgroud)