【发布时间】:2014-07-29 10:31:46
【问题描述】:
我正在尝试使用 boost::iostreams::gzip_compressor 即时压缩使用 Boost Log 库创建的日志文件。因此,当我调用BOOST_LOG() 时,输出会即时压缩。到目前为止,这是我尝试过的:
#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/smart_ptr/make_shared_object.hpp>
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/sources/logger.hpp>
void init()
{
// Construct the sink
typedef boost::log::sinks::synchronous_sink< boost::log::sinks::text_ostream_backend > text_sink;
boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink >();
boost::shared_ptr< std::ofstream > file = boost::make_shared< std::ofstream >(
"sample.gz", std::ios_base::out | std::ios_base::binary );
boost::iostreams::filtering_ostream out;
out.push( boost::iostreams::gzip_compressor() );
out.push( *(file.get()) );
for( int i = 0; i < 10; i++ ) {
out << "Hello world! " << i << std::endl; // compresses OK
}
sink->locked_backend()->add_stream( file );
// Register the sink in the logging core
boost::log::core::get()->add_sink( sink );
}
int main( )
{
init();
boost::log::sources::logger lg;
for( int i = 0; i < 10; i++ )
BOOST_LOG(lg) << "Bye world!" << std::endl; // Does not compress
return 0;
}
我觉得我应该以某种方式要么
1)将整个filtering_ostream作为一个接收器,而不仅仅是file或
2) 以某种方式推送记录器接收器而不是 filtering_ostream 中的 file。
有人能指出我正确的方向吗?谢谢!
【问题讨论】:
标签: c++ boost iostream boost-iostreams boost-log