2023-07-21 10:47:31 +08:00
|
|
|
#include "BoostLog.h"
|
|
|
|
#include <boost/log/expressions.hpp>
|
|
|
|
#include <boost/log/sinks.hpp>
|
|
|
|
#include <boost/log/sources/severity_logger.hpp>
|
|
|
|
#include <boost/log/support/date_time.hpp>
|
|
|
|
#ifdef ANDROID
|
|
|
|
#include "AndroidBoostLog.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static void logFormatter(boost::log::record_view const &record, boost::log::formatting_ostream &ostream);
|
|
|
|
|
|
|
|
BOOST_LOG_GLOBAL_LOGGER_INIT(location_logger, LocationLogger<boost::log::trivial::severity_level>) {
|
|
|
|
LocationLogger<boost::log::trivial::severity_level> lg;
|
|
|
|
auto consoleSink = boost::log::add_console_log();
|
|
|
|
consoleSink->set_formatter(&logFormatter);
|
|
|
|
boost::log::add_common_attributes();
|
|
|
|
return lg;
|
|
|
|
}
|
|
|
|
|
2023-12-25 18:52:51 +08:00
|
|
|
void initBoostLog(const std::string &filename, const std::string &target, boost::log::trivial::severity_level filter) {
|
2023-07-21 10:47:31 +08:00
|
|
|
static bool initialized = false;
|
|
|
|
using namespace boost::log;
|
|
|
|
if (!initialized) {
|
|
|
|
boost::log::core::get()->set_filter(boost::log::trivial::severity >= filter);
|
|
|
|
add_common_attributes();
|
|
|
|
#ifdef ANDROID
|
|
|
|
using AndroidSink = boost::log::sinks::synchronous_sink<AndroidSinkBackend>;
|
|
|
|
auto sink = boost::make_shared<AndroidSink>();
|
|
|
|
sink->set_formatter(&androidLogFormatter);
|
|
|
|
boost::log::core::get()->add_sink(sink);
|
|
|
|
#else
|
|
|
|
std::ostringstream oss;
|
2023-12-25 18:52:51 +08:00
|
|
|
oss << filename << "_%Y-%m-%d_%H.%M.%S_%N.log";
|
2023-07-21 10:47:31 +08:00
|
|
|
auto fileSink =
|
2023-12-25 18:52:51 +08:00
|
|
|
add_file_log(keywords::file_name = oss.str(), keywords::auto_flush = true, keywords::target = target);
|
2023-07-21 10:47:31 +08:00
|
|
|
fileSink->set_formatter(&logFormatter);
|
|
|
|
#endif
|
|
|
|
initialized = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void logFormatter(const boost::log::record_view &record, boost::log::formatting_ostream &ostream) {
|
|
|
|
using namespace boost::log;
|
|
|
|
|
|
|
|
std::string level;
|
|
|
|
boost::log::formatting_ostream oss(level);
|
|
|
|
oss << "[" << record[boost::log::trivial::severity] << "]";
|
|
|
|
|
|
|
|
auto dateTimeFormatter = expressions::stream << expressions::format_date_time<boost::posix_time::ptime>(
|
|
|
|
"TimeStamp", "[%m-%d %H:%M:%S.%f]");
|
|
|
|
|
|
|
|
dateTimeFormatter(record, ostream);
|
|
|
|
ostream << "[" << boost::log::extract<boost::log::attributes::current_thread_id::value_type>("ThreadID", record)
|
|
|
|
<< "]";
|
|
|
|
ostream << std::setw(8) << std::left << level;
|
|
|
|
auto &&category = record[AmassKeywords::category];
|
|
|
|
if (!category.empty()) ostream << " [" << category << "]";
|
|
|
|
const auto &filename = record[AmassKeywords::filename];
|
|
|
|
if (!filename.empty()) {
|
|
|
|
#ifdef QT_CREATOR_CONSOLE
|
|
|
|
ostream << " [file:///" << filename << ":" << record[AmassKeywords::line] << "] ";
|
|
|
|
#else
|
|
|
|
ostream << " [" << filename << ":" << record[AmassKeywords::line] << "] ";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
// Finally, put the record message to the stream
|
|
|
|
ostream << record[expressions::smessage];
|
|
|
|
}
|