diff options
Diffstat (limited to 'src/boost/libs/log/example/wide_char/main.cpp')
-rw-r--r-- | src/boost/libs/log/example/wide_char/main.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/boost/libs/log/example/wide_char/main.cpp b/src/boost/libs/log/example/wide_char/main.cpp new file mode 100644 index 00000000..0c52afaa --- /dev/null +++ b/src/boost/libs/log/example/wide_char/main.cpp @@ -0,0 +1,121 @@ +/* + * 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 wide character logging. + */ + +#include <iostream> +#include <boost/locale/generator.hpp> +#include <boost/date_time/posix_time/posix_time_types.hpp> + +#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/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; + +//[ example_wide_char_severity_level_definition +enum severity_level +{ + normal, + notification, + warning, + error, + critical +}; + +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; +} +//] + +//[ example_wide_char_logging_initialization +// Declare attribute keywords +BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", severity_level) +BOOST_LOG_ATTRIBUTE_KEYWORD(timestamp, "TimeStamp", boost::posix_time::ptime) + +void init_logging() +{ + boost::shared_ptr< sinks::synchronous_sink< sinks::text_file_backend > > sink = logging::add_file_log + ( + "sample.log", + keywords::format = expr::stream + << expr::format_date_time(timestamp, "%Y-%m-%d, %H:%M:%S.%f") + << " <" << severity.or_default(normal) + << "> " << expr::message + ); + + // The sink will perform character code conversion as needed, according to the locale set with imbue() + std::locale loc = boost::locale::generator()("en_US.UTF-8"); + sink->imbue(loc); + + // Let's add some commonly used attributes, like timestamp and record counter. + logging::add_common_attributes(); +} +//] + +//[ example_wide_char_logging +void test_narrow_char_logging() +{ + // Narrow character logging still works + src::logger lg; + BOOST_LOG(lg) << "Hello, World! This is a narrow character message."; +} + +void test_wide_char_logging() +{ + src::wlogger lg; + BOOST_LOG(lg) << L"Hello, World! This is a wide character message."; + + // National characters are also supported + const wchar_t national_chars[] = { 0x041f, 0x0440, 0x0438, 0x0432, 0x0435, 0x0442, L',', L' ', 0x043c, 0x0438, 0x0440, L'!', 0 }; + BOOST_LOG(lg) << national_chars; + + // Now, let's try logging with severity + src::wseverity_logger< severity_level > slg; + BOOST_LOG_SEV(slg, normal) << L"A normal severity message, will not pass to the file"; + BOOST_LOG_SEV(slg, warning) << L"A warning severity message, will pass to the file"; + BOOST_LOG_SEV(slg, error) << L"An error severity message, will pass to the file"; +} +//] + +int main(int argc, char* argv[]) +{ + init_logging(); + test_narrow_char_logging(); + test_wide_char_logging(); + + return 0; +} |