| /* |
| * 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) |
| */ |
| /*! |
| * \file main.cpp |
| * \author Andrey Semashev |
| * \date 11.11.2007 |
| * |
| * \brief An example of basic library usage. See the library tutorial for expanded |
| * comments on this code. It may also be worthwhile reading the Wiki requirements page: |
| * http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Boost.Logging |
| */ |
| |
| // #define BOOST_LOG_USE_CHAR |
| // #define BOOST_ALL_DYN_LINK 1 |
| // #define BOOST_LOG_DYN_LINK 1 |
| |
| #include <iostream> |
| |
| #include <boost/log/common.hpp> |
| #include <boost/log/expressions.hpp> |
| |
| #include <boost/log/utility/setup/file.hpp> |
| #include <boost/log/utility/setup/console.hpp> |
| #include <boost/log/utility/setup/common_attributes.hpp> |
| |
| #include <boost/log/attributes/timer.hpp> |
| #include <boost/log/attributes/named_scope.hpp> |
| |
| #include <boost/log/sources/logger.hpp> |
| |
| #include <boost/log/support/date_time.hpp> |
| |
| namespace logging = boost::log; |
| namespace sinks = boost::log::sinks; |
| namespace attrs = boost::log::attributes; |
| namespace src = boost::log::sources; |
| namespace expr = boost::log::expressions; |
| namespace keywords = boost::log::keywords; |
| |
| using boost::shared_ptr; |
| |
| // Here we define our application severity levels. |
| enum severity_level |
| { |
| normal, |
| notification, |
| warning, |
| error, |
| critical |
| }; |
| |
| // The formatting logic for the severity level |
| template< typename CharT, typename TraitsT > |
| inline std::basic_ostream< CharT, TraitsT >& operator<< ( |
| std::basic_ostream< CharT, TraitsT >& strm, severity_level lvl) |
| { |
| static const char* const str[] = |
| { |
| "normal", |
| "notification", |
| "warning", |
| "error", |
| "critical" |
| }; |
| if (static_cast< std::size_t >(lvl) < (sizeof(str) / sizeof(*str))) |
| strm << str[lvl]; |
| else |
| strm << static_cast< int >(lvl); |
| return strm; |
| } |
| |
| int main(int argc, char* argv[]) |
| { |
| // This is a simple tutorial/example of Boost.Log usage |
| |
| // The first thing we have to do to get using the library is |
| // to set up the logging sinks - i.e. where the logs will be written to. |
| logging::add_console_log(std::clog, keywords::format = "%TimeStamp%: %Message%"); |
| |
| // One can also use lambda expressions to setup filters and formatters |
| logging::add_file_log |
| ( |
| "sample.log", |
| keywords::filter = expr::attr< severity_level >("Severity") >= warning, |
| keywords::format = expr::stream |
| << expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d, %H:%M:%S.%f") |
| << " [" << expr::format_date_time< attrs::timer::value_type >("Uptime", "%O:%M:%S") |
| << "] [" << expr::format_named_scope("Scope", keywords::format = "%n (%f:%l)") |
| << "] <" << expr::attr< severity_level >("Severity") |
| << "> " << expr::message |
| /* |
| keywords::format = expr::format("%1% [%2%] [%3%] <%4%> %5%") |
| % expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d, %H:%M:%S.%f") |
| % expr::format_date_time< attrs::timer::value_type >("Uptime", "%O:%M:%S") |
| % expr::format_named_scope("Scope", keywords::format = "%n (%f:%l)") |
| % expr::attr< severity_level >("Severity") |
| % expr::message |
| */ |
| ); |
| |
| // Also let's add some commonly used attributes, like timestamp and record counter. |
| logging::add_common_attributes(); |
| logging::core::get()->add_thread_attribute("Scope", attrs::named_scope()); |
| |
| BOOST_LOG_FUNCTION(); |
| |
| // Now our logs will be written both to the console and to the file. |
| // Let's do a quick test and output something. We have to create a logger for this. |
| src::logger lg; |
| |
| // And output... |
| BOOST_LOG(lg) << "Hello, World!"; |
| |
| // Now, let's try logging with severity |
| src::severity_logger< severity_level > slg; |
| |
| // Let's pretend we also want to profile our code, so add a special timer attribute. |
| slg.add_attribute("Uptime", attrs::timer()); |
| |
| BOOST_LOG_SEV(slg, normal) << "A normal severity message, will not pass to the file"; |
| BOOST_LOG_SEV(slg, warning) << "A warning severity message, will pass to the file"; |
| BOOST_LOG_SEV(slg, error) << "An error severity message, will pass to the file"; |
| |
| return 0; |
| } |