Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Wide character logging

Boost , Chapter 1. Boost.Log v2 , Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Библиотека поддерживает логирование строк, содержащих национальные символы. Есть в основном два способа сделать это. В UNIX-подобных системах обычно используется многобайтное кодирование символов (например, UTF-8) для представления национальных символов. В этом случае библиотека может быть использована только так, как она используется для простой регистрации ASCII, никакой дополнительной настройки не требуется.

В Windows обычной практикой является использование широких строк для представления национальных символов. Кроме того, большая часть системного API ориентирована на широкий характер, что требует, чтобы Windows-специфические раковины также поддерживали широкие строки. С другой стороны, общие раковины, такие как раковинатекстового файла, ориентированы на байт (потому что, ну, вы храните байты в файлах, а не символы). Это заставляет библиотеку выполнять преобразование кода символов, когда это необходимо. Чтобы создать библиотеку для этого, нужно пропитать раковину локализацией с соответствующей<codecvt>гранью.Boost.Localeможет быть использована для создания такой области. Давайте посмотрим пример:

// 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();
}

Для начала рассмотрим формататор, который мы передаем в параметре<format>. Мы инициализируем мойку с помощью форматтера с узкими символами, потому что текстовый файл мойки обрабатывает байты. Можно использовать широкие строки в форматировщике, но не в форматных строках, как тот, который мы использовали с функцией<format_date_time>. Также обратите внимание, что мы использовали<message>ключевое слово для обозначения сообщений записи журнала. Этотзаполнительподдерживает как узкие, так и широкие сообщения символов, поэтому формататор будет работать с обоими. В рамках процесса форматирования библиотека будет преобразовывать сообщения с широкими символами в многобайтное кодирование с использованием встроенной локализации, которую мы установили в UTF-8.

[Tip]Tip

Значения атрибутов также могут содержать широкие строки. Как и сообщения записи журнала, эти строки будут преобразованы с помощью встроенной локализации в кодирование целевого символа.

Здесь не хватает одного определения типа<severity_level>. Тип - это просто перечисление, но если мы хотим поддерживать его форматирование как для узких, так и для широких поглотителей символов, его потоковый оператор должен быть шаблоном. Это может быть полезно, если мы создаем несколько раковин с различными типами символов.

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;
}

Теперь мы можем издавать записи журналов. Мы можем использовать регистраторы с префиксом<w>в их именах для составления широких сообщений символов.

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";
}

Как видите, широкая композиция сообщений символов похожа на узкую вырубку. Обратите внимание, что вы можете использовать как узкую, так и широкую запись символов одновременно; все записи будут обрабатываться нашей раковиной. Полный код этого примера можно найти здесь.

Следует отметить, что некоторые раковины (в основном, Windows-специфические) позволяют указать тип целевого символа. Когда в регистрационных записях ожидаются национальные символы, всегда следует использовать<wchar_t>в качестве целевого типа символов в этих случаях, потому что раковина будет использовать широкий API ОС символов для обработки регистрационных записей. В этом случае все узкие строки символов будут расширены с использованием локализации, пропитанной раковиной при выполнении форматирования.


PrevUpHomeNext

Статья Wide character logging раздела Chapter 1. Boost.Log v2 Tutorial может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:38:35/0.007357120513916/0