diff options
Diffstat (limited to 'src/boost/libs/log/example/keywords')
-rw-r--r-- | src/boost/libs/log/example/keywords/Jamfile.v2 | 58 | ||||
-rw-r--r-- | src/boost/libs/log/example/keywords/main.cpp | 133 |
2 files changed, 191 insertions, 0 deletions
diff --git a/src/boost/libs/log/example/keywords/Jamfile.v2 b/src/boost/libs/log/example/keywords/Jamfile.v2 new file mode 100644 index 00000000..54db6e11 --- /dev/null +++ b/src/boost/libs/log/example/keywords/Jamfile.v2 @@ -0,0 +1,58 @@ +# +# 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) +# + +import ../../build/log-platform-config ; + +project + : requirements + <conditional>@log-platform-config.set-platform-defines + + <link>shared:<define>BOOST_ALL_DYN_LINK + <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS + <toolset>msvc:<define>_SCL_SECURE_NO_DEPRECATE + <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS + <toolset>msvc:<define>_CRT_SECURE_NO_DEPRECATE + <toolset>msvc:<cxxflags>/bigobj + <toolset>msvc:<cxxflags>/wd4503 # decorated name length exceeded, name was truncated + <toolset>msvc:<cxxflags>/wd4456 # declaration of 'A' hides previous local declaration + <toolset>msvc:<cxxflags>/wd4459 # declaration of 'A' hides global declaration + <toolset>msvc:<cxxflags>/wd4003 # not enough actual parameters for macro 'X' - caused by BOOST_PP_IS_EMPTY and BOOST_PP_IS_BEGIN_PARENS which are used by Fusion + <toolset>intel-win:<define>_SCL_SECURE_NO_WARNINGS + <toolset>intel-win:<define>_SCL_SECURE_NO_DEPRECATE + <toolset>intel-win:<define>_CRT_SECURE_NO_WARNINGS + <toolset>intel-win:<define>_CRT_SECURE_NO_DEPRECATE + <toolset>darwin:<cxxflags>-ftemplate-depth-1024 + <toolset>gcc:<cxxflags>-ftemplate-depth-1024 + <toolset>gcc:<cxxflags>-fno-strict-aliasing # avoids strict aliasing violations in other Boost components + + # Disable Intel warnings: + # warning #177: function "X" was declared but never referenced + # warning #780: using-declaration ignored -- it refers to the current namespace + # warning #2196: routine is both "inline" and "noinline" + # remark #1782: #pragma once is obsolete. Use #ifndef guard instead. + # remark #193: zero used for undefined preprocessing identifier "X" + # remark #304: access control not specified ("public" by default) + # remark #981: operands are evaluated in unspecified order + # remark #1418: external function definition with no prior declaration + # Mostly comes from Boost.Phoenix: warning #411: class "X" defines no constructor to initialize the following: reference member "Y"... + # warning #734: "X" (declared at line N of "file.hpp"), required for copy that was eliminated, is inaccessible + # warning #279: controlling expression is constant + <toolset>intel-win:<cxxflags>"/Qwd177,780,2196,1782,193,304,981,1418,411,734,279" + <toolset>intel-linux:<cxxflags>"-wd177,780,2196,1782,193,304,981,1418,411,734,279" + <toolset>intel-darwin:<cxxflags>"-wd177,780,2196,1782,193,304,981,1418,411,734,279" + + <library>/boost/log//boost_log + <library>/boost/log//boost_log_setup + <library>/boost/date_time//boost_date_time + <library>/boost/filesystem//boost_filesystem + <threading>single:<define>BOOST_LOG_NO_THREADS + <threading>multi:<library>/boost/thread//boost_thread + ; + +exe keywords + : main.cpp + ; diff --git a/src/boost/libs/log/example/keywords/main.cpp b/src/boost/libs/log/example/keywords/main.cpp new file mode 100644 index 00000000..5271f95a --- /dev/null +++ b/src/boost/libs/log/example/keywords/main.cpp @@ -0,0 +1,133 @@ +/* + * 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 01.12.2012 + * + * \brief An example of using attribute keywords. + */ + +// #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; +} + +// Declare attribute keywords +BOOST_LOG_ATTRIBUTE_KEYWORD(_severity, "Severity", severity_level) +BOOST_LOG_ATTRIBUTE_KEYWORD(_timestamp, "TimeStamp", boost::posix_time::ptime) +BOOST_LOG_ATTRIBUTE_KEYWORD(_uptime, "Uptime", attrs::timer::value_type) +BOOST_LOG_ATTRIBUTE_KEYWORD(_scope, "Scope", attrs::named_scope::value_type) + +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%: %_%"); + + // One can also use lambda expressions to setup filters and formatters + logging::add_file_log + ( + "sample.log", + keywords::filter = _severity >= warning, + keywords::format = expr::stream + << expr::format_date_time(_timestamp, "%Y-%m-%d, %H:%M:%S.%f") + << " [" << expr::format_date_time(_uptime, "%O:%M:%S") + << "] [" << expr::format_named_scope(_scope, keywords::format = "%n (%f:%l)") + << "] <" << _severity + << "> " << expr::message +/* + keywords::format = expr::format("%1% [%2%] [%3%] <%4%> %5%") + % expr::format_date_time(_timestamp, "%Y-%m-%d, %H:%M:%S.%f") + % expr::format_date_time(_uptime, "%O:%M:%S") + % expr::format_named_scope(_scope, keywords::format = "%n (%f:%l)") + % _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; +} |