我正在考虑开始使用Boost.Log日志库.有人使用Boost.Log吗?请分享您在这方面的经验.
我正在考虑的其他库是Apache log4cxx(安装起来似乎很乏味,但我的队友想要一些简单易用的东西)和Pantheios(同样的问题,因为它适用于额外的前端和后端).
我正在使用Boost-Log 2.0,它与版本1存在一些差异,我很难输出"Severity"属性.
我正在使用"Boost.Format-style"格式化程序
"%TimeStamp% [%Uptime%] (%LineID%) <%Severity%>: %Message%"
Run Code Online (Sandbox Code Playgroud)
TimeStamp
,LineID
和Message
是common_attributes
.Uptime
是我添加的属性attrs::timer()
.我认为Severity
在使用时会自动添加severity_logger
,但显然不是,这是我的问题.我得到空的严重性,例如:
2013-Apr-06 19:21:52.408974 [00:00:00.001337] (3) <>: A warning severity message
Run Code Online (Sandbox Code Playgroud)
注意空<>
.我试图添加严重性,register_simple_formatter_factory
但后来我得到编译器错误:
error: no matching function for call to ‘register_simple_formatter_factory(const char [9])’
Run Code Online (Sandbox Code Playgroud)
而且我不明白为什么.
这是我的代码:
#include <iostream>
#include <boost/log/common.hpp>
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/formatter_parser.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/sources/severity_feature.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/attributes.hpp> …
Run Code Online (Sandbox Code Playgroud) 我有一个sinks::text_file_backend
水槽.说我已经有一些旋转的日志文件:
myLog001.log,myLog002.log等
我希望接收器继续写入最后一个旋转的文件 - myLog002.log,附加到其内容并从那里继续旋转.
我只是设法找到,keywords::open_mode = append
但这只是附加在现有的myLogX文件之上,使它们更大,当然很难阅读.
可以在Boost.Log中完成吗?
我正在尝试在我正在进行的项目中使用新的Boost.Log库.该项目是用CMake构建的.我收到链接错误声称链接器遇到了对Boost.Log的未定义引用
Linking CXX executable main
CMakeFiles/main.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x30): undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
Run Code Online (Sandbox Code Playgroud)
我有一个简单的hello world测试,但没有出现这些错误.如果我链接Boost.Log库会导致它产生未定义的引用错误?
main.cpp中:
#include <boost/log/trivial.hpp>
int main(int argc, char* const argv[]) {
BOOST_LOG_TRIVIAL(info) << "Hello World";
}
Run Code Online (Sandbox Code Playgroud)
的CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
FIND_PACKAGE(Boost 1.54 COMPONENTS log REQUIRED)
FIND_PACKAGE(Threads)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
ADD_EXECUTABLE(main main.cpp)
TARGET_LINK_LIBRARIES(main ${Boost_LOG_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
Run Code Online (Sandbox Code Playgroud)
编辑:来自cmake和make的详细输出
cmake的:
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:476 ] _boost_TEST_VERSIONS = 1.56.0;1.56;1.55.0;1.55;1.54.0;1.54
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:478 ] Boost_USE_MULTITHREADED = TRUE
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:480 ] Boost_USE_STATIC_LIBS =
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:482 ] Boost_USE_STATIC_RUNTIME =
-- [ /usr/share/cmake-2.8/Modules/FindBoost.cmake:484 ] Boost_ADDITIONAL_VERSIONS = …
Run Code Online (Sandbox Code Playgroud) 我一直在努力使用boost日志 - 我得到了他们写一个日志文件的简单示例(http://boost-log.sourceforge.net/libs/log/example/doc/tutorial_file.cpp).但是,当我尝试将该代码复制到"Logger"类时,我无法将其写入日志文件.我可以看到文件default.log
被创建,但它没有任何内容.
我在debian 7 64bit上.一切都编译好 - 编译行是:
g++ -o build/Logger.o -c -std=c++11 -Wall -g -O0 -DBOOST_LOG_DYN_LINK -DDEBUG src/Logger.cpp
g++ -o build/logtest build/Logger.o -lboost_log -lboost_log_setup -lboost_date_time -lboost_thread -lboost_wave -lboost_regex -lboost_program_options
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
Logger.cpp
/*
* Logger.cpp
*
* Created on: 2011-01-17
* Author: jarrett
*/
#include "Logger.h"
namespace logging = boost::log;
namespace sinks = boost::log::sinks;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;
namespace dhlogging {
Logger::Logger(std::string fileName)
{ …
Run Code Online (Sandbox Code Playgroud) 我想在并发应用程序中使用简单的日志文件.我已经下载了Boost.Log
v2.0并使用编译它Boost 1.53.0
.
问题是Boost.Log
控制台上的输出.我正在使用BOOST_LOG_TRIVIAL(trace)
.
有没有一种很好的方法来重定向BOOST_LOG_TRIVIAL
到文件?
我正在使用Boost(1.55.0)登录我的C++应用程序.我已经能够生成这种格式的日志
[2014-Jul-15 10:47:26.137959]: <debug> A regular message
Run Code Online (Sandbox Code Playgroud)
我希望能够在生成日志的位置添加源文件名和行号.
[2014-Jul-15 10:47:26.137959]: <debug> [filename:line_no] A regular message
Run Code Online (Sandbox Code Playgroud)
例:
[2014-Jul-15 10:47:26.137959]: <debug> [helloworld.cpp : 12] A regular message
Run Code Online (Sandbox Code Playgroud)
源代码:
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/log/attributes/attribute.hpp>
#include <boost/log/attributes/attribute_cast.hpp>
#include <boost/log/attributes/attribute_value.hpp>
#include <boost/make_shared.hpp>
#include <boost/property_tree/ptree.hpp>
namespace logging = boost::log;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace keywords = boost::log::keywords;
void init()
{
logging::add_file_log
(
keywords::file_name = "sample_%N.log", …
Run Code Online (Sandbox Code Playgroud) 我想得到年 - 月 - 小时:分:秒.分数(2位数),如果我使用"%Y-%m-%d%H:%M:%S.%f",我几乎得到了什么我想要秒的分数(最后一部分)的异常,它在我的Windows XP上显示6位数,我不知道如何获得2位数,任何想法?
我从服务器端应用程序获得valgrind泄漏报告,该应用程序使用与boost 1.56一起分发的boostlog.valgrind报告是:
== 8021 == 1,159块中的37,088字节肯定会在1,642的损失记录1,613中丢失
== 8021 ==在0x4A05588:memalign(vg_replace_malloc.c:727)
== 8021 == by 0x3FDA61118F:tls_get_addr_tail(在/lib64/ld-2.12.so中)
== 8021 == by 0x3FDA61165F:__ tls_get_addr(在/lib64/ld-2.12.so中)
== 8021 == by 0x3FE6ABBDCB:__ cxa_get_globals(在/usr/lib64/libstdc++.so.6.0.13中)
== 8021 == by 0x730C528:boost :: log :: v2_mt_posix :: aux :: unhandled_exception_count()(在/opt/sesteksdk/lib/libboost_log.so.1.56.0中)
== 8021 == by 0x5D54D1F:sestek :: mrcp :: audio :: recognition :: AsynchronousRecognizer :: Notify(sestek :: voice :: recognition :: IRecognizerNotification const*)(record_ostream.hpp:259)
这种泄漏来自一条简单的线路:
LOGGER(debug)<< _chanProp->GetId() << " got recognition ended notification from recognizer";
我们从一次短暂的测试运行中得到了5个泄漏.
我们使用文本文件后端,同步接收器,自动刷新打开.基本上:
void InitializeFileLog(const std::string & logDir)
{ …
Run Code Online (Sandbox Code Playgroud) 我正在使用boost 1.54.0.您可以在下面找到说明我的问题的最小示例.
我使用boost日志的severity_logger.我想从流中配置我的接收器.(在下面的示例中,我使用了一个字符串流.在我的实际应用程序中,流来自一个文件.)我想使用%Severity%来输出或过滤.
我的问题是:如果我在下面的例子中给出它,%Severity%为空.
%LineID%和%Message%按预期填充.如果我在outcommented行中设置了一个接收器,它会按预期工作.
有任何想法吗?
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/utility/setup/from_stream.hpp>
#include <boost/log/utility/setup/console.hpp>
#include <boost/log/expressions.hpp>
enum SeverityLevel { trace, fatal };
int main (int argc, char *argv[])
{
boost::log::add_common_attributes();
/*
struct severity_tag;
boost::log::add_console_log(std::clog,
boost::log::keywords::format = (
boost::log::expressions::stream
<< boost::log::expressions::attr< unsigned int >("LineID")
<< ": <" << boost::log::expressions::attr<SeverityLevel, severity_tag >("Severity")
<< "> " << boost::log::expressions::smessage)
); */
std::stringstream s;
s << "[Sinks.MySink]" << std::endl;
s << "Destination=Console" << std::endl;
s << "Format=\"%LineID%: <%Severity%> - %Message%\"" …
Run Code Online (Sandbox Code Playgroud)