Giriş
Şu satırı dahil ederiz.
Şu satırı dahil ederiz.
Şöyle yaparız.
Şöyle yaparız.
Örnek
Şöyle yaparız. add_file_log() çağrısı ile eklenen sink'i siler.
Şöyle yaparız. Bu sefer kaldırılan sink flush() edilerek boşaltılıyor.
Şöyle yaparız.
Açıklaması şöyle.
filter tipinden bir nesnesi alır. Şöyle yaparız.
Eğer nesne değil de metod kullanmak istersek şöyle yaparız.
Şu satırı dahil ederiz.
#include <boost/log/core.hpp>
add_global_attribute metoduŞu satırı dahil ederiz.
#include <boost/log/attributes.hpp>
Şöyle yaparız.core->add_global_attribute("UTCTimeStamp",boost::log::attributes::utc_clock());
Şöyle yaparız.logging::core::get()->add_global_attribute("TimeStamp", attrs::local_clock());
add_sink metoduŞöyle yaparız.
auto sink = ...;
core->add_sink(sink);
get metoduŞöyle yaparız.
auto core = boost::log::core::get();
remove_sink metoduÖrnek
Şöyle yaparız. add_file_log() çağrısı ile eklenen sink'i siler.
typedef sinks::synchronous_sink< sinks::text_file_backend > sink_t;
boost::shared_ptr< sink_t > g_file_sink;
void Init() {
// ...
g_file_sink = logging::add_file_log
(
keywords::file_name = logfile + "_%N.log",
keywords::rotation_size = 1024 * 1024 * 50, // 50MB log file max
keywords::format = "%Message% #[%TimeStamp%]"
);
// ...
}
void StopFileLogging() {
logging::core::get()->remove_sink(g_file_sink);
g_file_sink.reset();
}
ÖrnekŞöyle yaparız. Bu sefer kaldırılan sink flush() edilerek boşaltılıyor.
boost::log::core::get()-> remove_sink(sinkptr);
sinkptr->flush();
sinkptr.reset();
set_flter metodu ve evaluationŞöyle yaparız.
#include <chrono>
#include <thread>
#include <boost/log/core.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/trivial.hpp>
std::string time_costly_function(
const std::chrono::seconds seconds = std::chrono::seconds{1}) {
std::this_thread::sleep_for(seconds);
return "DONE with time_costly_function";
}
boost::log::core::get()->set_filter(boost::log::trivial::severity >=
boost::log::trivial::warning);
BOOST_LOG_TRIVIAL(warning) << "This is evaluated: " << time_costly_function();
BOOST_LOG_TRIVIAL(info) << "This is NOT evaluated: "<< time_costly_function();
Çıktı olarak sadece birinci log'u alırız. Sebebi ise BOOSt_LOG_TRIVIAL macrosunun şuna benzemesi. Yani önce filter kontrol edilir. Eğer true ise ikinci metod çağrılır.#define FW_LOG(logger, level, message) \
do { if (logger.check_level(level)) logger.log(message); while (false)
set_filter metodu - filterAçıklaması şöyle.
The first argument in the filter expression is a keyword and also a Boost.Phoenix terminal
It makes the filter expression build a Boost.Phoenix function object instead of evaluating
the comparison immediately.
Global bir filtre oluşturur. Global filtre yerine tek bir sink'e de filtre atanabilir.filter tipinden bir nesnesi alır. Şöyle yaparız.
core->set_filter (
boost::log::trivial::severity >= boost::log::trivial::warning
);
Şöyle yaparızcore->set_filter (
boost::log::trivial::severity >= boost::log::trivial::info
);
Şöyle yaparız.logging::core::get()->set_filter (
//Write all records with "info" severity or higher
expr::attr<SeverityLevel>("Severity").or_default(SeverityLevel::INFO)
>= SeverityLevel::INFO
);
set_filter - metodEğer nesne değil de metod kullanmak istersek şöyle yaparız.
// Define your severity levels
enum severity_level
{
debug, normal, error, fatal
};
// Define an attribute keyword for severity level
BOOST_LOG_ATTRIBUTE_KEYWORD(a_severity, "Severity", severity_level)
// Define a logger type that uses your severity levels
typedef boost::log::sources::severity_logger< severity_level > logger;
// Define a filter that will check the severity
bool abort_filter(
boost::log::value_ref< severity_level, tag::a_severity > const& level)
{
// Don't forget to check if the record has a severity level at all
if (level && level.get() >= error)
std::abort();
// Pass all log records that didn't trigger the abort
return true;
}
Şöyle yaparız.// Set global filter
boost::log::core::get()->set_filter(
boost::phoenix::bind(&abort_filter, a_severity.or_none()));