19 #include <boost/log/expressions/attr_fwd.hpp> 
   20 #include <boost/log/expressions/attr.hpp> 
   21 #include <boost/log/expressions/formatters/date_time.hpp> 
   22 #include <boost/log/keywords/channel.hpp> 
   23 #include <boost/log/sources/severity_channel_logger.hpp> 
   24 #include <boost/log/sources/record_ostream.hpp> 
   25 #include <boost/log/support/date_time.hpp> 
   26 #include <boost/log/utility/setup/console.hpp> 
   27 #include <boost/log/utility/setup/file.hpp> 
   28 #include <boost/log/utility/setup/common_attributes.hpp> 
   30 #include <ubuntu/download_manager/download_struct.h> 
   33 typedef boost::log::sources::severity_channel_logger_mt<
 
   38     const std::string DOWNLOAD_MANAGER_CHANNEL = 
"ubuntu_download_manager";
 
   39     void my_formatter(boost::log::record_view 
const& rec,
 
   40                       boost::log::formatting_ostream& strm) {
 
   43         strm << boost::log::extract<unsigned int>(
"LineID", rec) << 
" [";
 
   44         strm << boost::log::extract<boost::posix_time::ptime>(
"TimeStamp", rec) << 
"] ";
 
   45         strm << boost::log::extract<std::string>(
"Channel", rec) << 
" [";
 
   46         auto severity = boost::log::extract<Logger::Level>(
"Severity", rec).get();
 
   54             case Logger::Notification:
 
   55                 strm << 
"Notification";
 
   69         strm << rec[boost::log::expressions::smessage];
 
   75 namespace DownloadManager {
 
   85             boost::log::add_common_attributes();
 
   88                 boost::log::keywords::channel = DOWNLOAD_MANAGER_CHANNEL,
 
   89                 boost::log::keywords::severity = lvl);
 
   92             auto sink  = boost::log::add_file_log(
 
   93                 boost::log::keywords::file_name = path.toStdString(),
 
   94                 boost::log::keywords::auto_flush = 
true 
   97             sink->set_formatter(&my_formatter);
 
  101                 boost::log::expressions::attr<std::string>(
"Channel") == DOWNLOAD_MANAGER_CHANNEL
 
  105             log(Logger::Critical, 
"Logger init called more than once.");
 
  110         if (_lg != 
nullptr) {
 
  111             auto rec = _lg->open_record(boost::log::keywords::severity = lvl);
 
  113                 boost::log::record_ostream strm(rec);
 
  114                 strm << msg.toStdString();
 
  116                 _lg->push_record(boost::move(rec));
 
  122         auto msg = msgList.join(
" ");
 
  126     void log(
Logger::Level lvl, 
const QString& msg, QMap<QString, QString> map) {
 
  127         auto fmtMsg = msg.arg(toString(map));
 
  131     void log(
Logger::Level lvl, 
const QString& msg, QMap<QString, QVariant> map) {
 
  132         auto fmtMsg = msg.arg(toString(map));
 
  136     void log(
Logger::Level lvl, 
const QString& msg, DownloadStruct downStruct) {
 
  139         list << 
"\n\t\tUrl: " << downStruct.getUrl()
 
  140              << 
"\n\t\tHash Algorithm: '" << downStruct.getAlgorithm() << 
"'" 
  141              << 
"\n\t\tMetadata: " << toString(downStruct.getMetadata())
 
  142              << 
"\n\t\tHeaders: " << toString(downStruct.getHeaders());
 
  144         auto fmtMsg = msg.arg(list.join(
""));
 
  149     QString toString(QMap<QString, QString> map) {
 
  152         int index = map.keys().count();
 
  153         foreach(
const QString& key, map.keys()) {
 
  154             list << 
"'" << key << 
"': '" << map[key] << 
"'";
 
  161         return list.join(
"");
 
  164     QString toString(QVariantMap map) {
 
  167         int index = map.keys().count();
 
  168         foreach(
const QString& key, map.keys()) {
 
  169             list << 
"'" << key << 
"': '" 
  170                 << map[key].toString() << 
"'";
 
  177         return list.join(
"");
 
  184 LoggerPrivate* Logger::_private = 
new LoggerPrivate();
 
  185 QMutex Logger::_mutex;
 
  190     _private->init(lvl, path);
 
  196     _private->log(lvl, msg);
 
  201     _private->log(lvl, msg);
 
  205 Logger::log(Level lvl, 
const QString& msg, QMap<QString, QString> map) {
 
  206     _private->log(lvl, msg, map);
 
  210 Logger::log(Level lvl, 
const QString& msg, QMap<QString, QVariant> map) {
 
  211     _private->log(lvl, msg, map);
 
  215 Logger::log(Level lvl, 
const QString& msg, DownloadStruct downStruct) {
 
  216     _private->log(lvl, msg, downStruct);