我是新手来提升日志。
我的算法有4个主要步骤,我想要记录一个文件中的每一步。所以我有4个水槽。我的想法是我可以在每一步都改变水槽。这可能吗?
目前我的looger.h
拥有全局记录器
#ifndef LOGGER_H_
#define LOGGER_H_
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/thread/thread.hpp>
#include <boost/log/core.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/log/common.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/sinks.hpp>
#include <boost/log/sources/logger.hpp>
#include <boost/log/utility/setup/common_attributes.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 <fstream>
namespace logging = boost::log;
namespace attrs = boost::log::attributes;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace expr = boost::log::expressions;
namespace keywords = boost::log::keywords;
enum sign_severity_level {
trace,
debug,
info,
warning,
error,
fatal,
report
};
void InitLog()
{
typedef sinks::synchronous_sink<sinks::text_ostream_backend> TextSink;
// init sink1
boost::shared_ptr<sinks::text_ostream_backend> backend1 = boost::make_shared<sinks::text_ostream_backend>();
backend1->add_stream(boost::shared_ptr<std::ostream>(new std::ofstream("sign.log")));
backend1->auto_flush(true);
boost::shared_ptr<TextSink> sink1(new TextSink(backend1));
sink1->set_formatter(
expr::format("[%1%]<%2%>(%3%): %4%") % expr::format_date_time < boost::posix_time::ptime
> ("TimeStamp", "%Y-%m-%d %H:%M:%S") % expr::attr < sign_severity_level > ("Severity") % expr::attr
< attrs::current_thread_id::value_type > ("ThreadID") % expr::smessage);
sink1->set_filter(expr::attr < sign_severity_level > ("Severity") >= warning);
logging::core::get()->add_sink(sink1);
logging::add_common_attributes();
logging::core::get()->add_global_attribute("ThreadID", attrs::current_thread_id());
}
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, src::severity_logger_mt<sign_severity_level>)
#endif /* LOGGER_H_ */
是否可以在每一步后更换水槽?
答案 0 :(得分:4)
您只需要更改接收器的流:
void set_log_file(const char* filename) {
backend_->remove_stream(current_stream_);
current_stream_.reset(new std::ofstream(filename));
backend_->add_stream(current_stream_);
}
用法:
manager.set_log_file("log_1.txt");
BOOST_LOG_SEV(log, error) << "This will go to log_1";
BOOST_LOG_SEV(log, error) << "And this one";
manager.set_log_file("log_2.txt");
BOOST_LOG_SEV(log, error) << "This will go to log_2";
manager.set_log_file("log_3.txt");
BOOST_LOG_SEV(log, error) << "This will go to log_3";
结果:
> cat log_1.txt
[...]<4>(0x00007fe742977780): This will go to log_1
[...]<4>(0x00007fe742977780): And this one
> cat log_2.txt
[...]<4>(0x00007fe742977780): This will go to log_2
> cat log_3.txt
[...]<4>(0x00007fe742977780): This will go to log_3