123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /*
- * Copyright Andrey Semashev 2007 - 2015.
- * Distributed under the Boost Software License, Version 1.0.
- * (See accompanying file LICENSE_1_0.txt or copy at
- * http://www.boost.org/LICENSE_1_0.txt)
- */
- #include <cstdlib>
- #include <string>
- #include <utility>
- #include <stdexcept>
- #include <boost/smart_ptr/shared_ptr.hpp>
- #include <boost/phoenix.hpp>
- #include <boost/log/trivial.hpp>
- #include <boost/log/core.hpp>
- #include <boost/log/expressions.hpp>
- #include <boost/log/attributes/current_process_name.hpp>
- #include <boost/log/sinks/sync_frontend.hpp>
- #include <boost/log/sinks/basic_sink_backend.hpp>
- #include <boost/log/sources/record_ostream.hpp>
- #include <boost/log/utility/value_ref.hpp>
- #include <boost/log/utility/formatting_ostream.hpp>
- #include <boost/log/utility/manipulators/add_value.hpp>
- namespace logging = boost::log;
- namespace attrs = boost::log::attributes;
- namespace src = boost::log::sources;
- namespace expr = boost::log::expressions;
- namespace sinks = boost::log::sinks;
- namespace keywords = boost::log::keywords;
- //[ example_extension_app_launcher_definition
- // The backend starts an external application to display notifications
- class app_launcher :
- public sinks::basic_formatted_sink_backend<
- char, /*< target character type >*/
- sinks::synchronized_feeding /*< in order not to spawn too many application instances we require records to be processed serial >*/
- >
- {
- public:
- // The function consumes the log records that come from the frontend
- void consume(logging::record_view const& rec, string_type const& command_line);
- };
- //]
- //[ example_extension_app_launcher_consume
- // The function consumes the log records that come from the frontend
- void app_launcher::consume(logging::record_view const& rec, string_type const& command_line)
- {
- std::system(command_line.c_str());
- }
- //]
- //[ example_extension_app_launcher_formatting
- BOOST_LOG_ATTRIBUTE_KEYWORD(process_name, "ProcessName", std::string)
- BOOST_LOG_ATTRIBUTE_KEYWORD(caption, "Caption", std::string)
- // Custom severity level formatting function
- std::string severity_level_as_urgency(
- logging::value_ref< logging::trivial::severity_level, logging::trivial::tag::severity > const& level)
- {
- if (!level || level.get() == logging::trivial::info)
- return "normal";
- logging::trivial::severity_level lvl = level.get();
- if (lvl < logging::trivial::info)
- return "low";
- else
- return "critical";
- }
- // The function initializes the logging library
- void init_logging()
- {
- boost::shared_ptr< logging::core > core = logging::core::get();
- typedef sinks::synchronous_sink< app_launcher > sink_t;
- boost::shared_ptr< sink_t > sink(new sink_t());
- const std::pair< const char*, const char* > shell_decorations[] =
- {
- std::pair< const char*, const char* >("\"", "\\\""),
- std::pair< const char*, const char* >("$", "\\$"),
- std::pair< const char*, const char* >("!", "\\!")
- };
- // Make the formatter generate the command line for notify-send
- sink->set_formatter
- (
- expr::stream << "notify-send -t 2000 -u "
- << boost::phoenix::bind(&severity_level_as_urgency, logging::trivial::severity.or_none())
- << expr::if_(expr::has_attr(process_name))
- [
- expr::stream << " -a '" << process_name << "'"
- ]
- << expr::if_(expr::has_attr(caption))
- [
- expr::stream << " \"" << expr::char_decor(shell_decorations)[ expr::stream << caption ] << "\""
- ]
- << " \"" << expr::char_decor(shell_decorations)[ expr::stream << expr::message ] << "\""
- );
- core->add_sink(sink);
- // Add attributes that we will use
- core->add_global_attribute("ProcessName", attrs::current_process_name());
- }
- //]
- //[ example_extension_app_launcher_logging
- void test_notifications()
- {
- BOOST_LOG_TRIVIAL(debug) << "Hello, it's a simple notification";
- BOOST_LOG_TRIVIAL(info) << logging::add_value(caption, "Caption text") << "And this notification has caption as well";
- }
- //]
- int main(int, char*[])
- {
- init_logging();
- test_notifications();
- return 0;
- }
|