2016-03-21 18 views
0

Logger.hBoost.log erstellen Textdatei Backend manuell

enum ChannelType { 
    main_channel, 
    sub_channel 
}; 
BOOST_LOG_ATTRIBUTE_KEYWORD(channel, "Channel", ChannelType) 

class Logger { 
public: 
    enum severity_level 
    { 
     debug, 
     info, 
     warning, 
     error, 
     fatal 
    }; 
    static void init(Logger::severity_level level); 
    typedef boost::log::sources::severity_channel_logger< Logger::severity_level, ChannelType > logger_type; 
    static thread_local logger_type gl; 
    static thread_local logger_type motion_checker; 
}; 

Logger.cpp

void Logger::init(Logger::severity_level level) 
    { 
     boost::shared_ptr<boost::log::core> core = boost::log::core::get(); 
     core->set_exception_handler(boost::log::make_exception_suppressor()); 
     core->set_filter(boost::log::expressions::attr<Logger::severity_level>("Severity") >= level); 
     { 
      typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::text_multifile_backend> multifile_sink; 
      boost::shared_ptr<multifile_sink> sink(new multifile_sink); 
      sink->locked_backend()->set_file_name_composer(boost::log::sinks::file::as_file_name_composer(
       boost::log::expressions::stream << "./log/Sub/" << boost::log::expressions::attr<std::string>("RoleName") << ".log")); 
      sink->set_formatter 
       (
        boost::log::expressions::format("[%1%] - %2%") 
        % boost::log::expressions::attr<boost::posix_time::ptime>("TimeStamp") 
        % boost::log::expressions::smessage 
        ); 
      sink->set_filter(channel == sub_channel); 
      core->add_sink(sink); 
     } 
//============use add_file_log============== 
     boost::log::add_file_log(
      boost::log::keywords::filter = channel == main_channel, 
      boost::log::keywords::file_name = "./log/%Y%m%d.log", 
      boost::log::keywords::auto_flush = true, 
      boost::log::keywords::open_mode = (std::ios::out | std::ios::app), 
      boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
      boost::log::keywords::format = "[%TimeStamp%] (%LineID%) {%ThreadID%}: %Message%" 
      ); 
//==================use add_file_log end==================== 
//=========manually add sink, this has problem================ 
     boost::shared_ptr<boost::log::sinks::text_file_backend> backend = 
      boost::make_shared<boost::log::sinks::text_file_backend>(
       boost::log::keywords::filter = channel == main_channel, 
       boost::log::keywords::file_name = "./log/%Y%m%d.log", 
       boost::log::keywords::auto_flush = true, 
       boost::log::keywords::open_mode = (std::ios::out | std::ios::app), 
       boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
       boost::log::keywords::format = "[%TimeStamp%] (%LineID%) {%ThreadID%}: %Message%" 
       ); 
     typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::text_file_backend> file_sink; 
     boost::shared_ptr<file_sink> sink(new file_sink(backend)); 
     core->add_sink(sink); 
//============manually add end========================== 
     boost::log::add_common_attributes(); 
    } 

    thread_local Logger::logger_type Logger::gl(boost::log::keywords::channel = main_channel); 
    thread_local Logger::logger_type Logger::motion_checker(boost::log::keywords::channel = sub_channel); 

main.cpp

int main() 
{ 
    Logger::init(Logger::debug); 
    BOOST_LOG_SEV(Logger::gl, Logger::debug) << "ssss"; 
    { 
     BOOST_LOG_SCOPED_LOGGER_ATTR(Logger::motion_checker, "RoleName", boost::log::attributes::constant<std::string>("aaa")) 
     BOOST_LOG_SEV(Logger::motion_checker, Logger::debug) << "aaaa"; 
    } 
    system("pause"); 
    return 0; 
} 

Mit add_file_log, alles in Ordnung ist, aber Die manuell hinzugefügte Spüle verlor alle Attribute, nur die Nachricht dort. Und der Filter ist auch nicht funktionieren, sub_channel Nachricht wird zu dieser Datei hinzufügen. Der Grund, warum ich diese Dateisenke manuell erstelle ist, weil add_file_log Sync-Senke erstellen, ich möchte eine asynchrone Senke.

+0

Ihre Frage hat nicht genug Details, um eine definitive Antwort zu geben. Meine Vermutung ist, dass Sie vergessen haben, diese Attribute, die Sie in Filtern und Formatierern verwenden, hinzuzufügen. –

+0

Ich füge Code hier ein. Ich benutze add_common_attributes hinzufügen attrs, aber es funktioniert nicht für die manuelle hinzufügen sinken – jean

Antwort

1

Das Problem ist, dass die benannten Parameter format und filter vom Sink-Frontend verwendet werden, nicht vom Backend, und Sie übergeben sie an das Backend. Daher werden weder Filter noch Formatierer gesetzt.

Ich schlage vor, dass Sie alle benannten Parameter in den Sink-Frontend-Konstruktor verschieben und die Parameter an den Backend-Konstruktor übergeben, anstatt das Backend selbst zu erstellen.

typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::text_file_backend> file_sink; 
    boost::shared_ptr<file_sink> sink = boost::make_shared<file_sink>(
      boost::log::keywords::filter = channel == main_channel, 
      boost::log::keywords::file_name = "./log/%Y%m%d.log", 
      boost::log::keywords::auto_flush = true, 
      boost::log::keywords::open_mode = (std::ios::out | std::ios::app), 
      boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0), 
      boost::log::keywords::format = "[%TimeStamp%] (%LineID%) {%ThreadID%}: %Message%" 
    ); 
    core->add_sink(sink); 
+0

Dies funktioniert nicht, der Filter und das Format funktioniert nicht. – jean