我正在尝试通过使用boost::iostreams::gzip_compressor
. 因此,当我调用时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)以某种方式推动记录器接收器而不是file
在filtering_ostream
.
有人可以指出我正确的方向吗?谢谢!