zoukankan      html  css  js  c++  java
  • Boost Log 基本使用方法

    Boost Log 基本使用方法
    flyfish 2014-11-5



    依据boost提供的代码演示样例,学习Boost Log 的基本使用方法


    前提
    boost版本号boost_1_56_0
    演示样例代码目录 boost_1_56_0libslogexampleasic_usage


    使用的单词非常形象。整个过程就像流水一样
    如果要输出的日志比作水

      水                     (Hello, World!)
      水槽                 (sink)
      流向哪里        (console,file)
      从哪里取        (source)

      水的等级        (severity level)
      过滤输出        (filter)
      格式输出        (format)
      各部分连接者(core)


    演示样例

    #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 _tmain(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;
    }

    从上到下依次分析

    一  日志严重性等级
    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)
    {
    ...
    }


    输出已经定义的等级描写叙述,日志等级的数值与字符串一一相应,假设在enum severity_level假设未定义则输出数值。




    std::basic_ostream对全部的内建类型,进行了重载,输入各种内置类型
    重载operator <<,使得自定的用户定义类型severity_level 集成到IOStream library中
    IOStream library的类都带有两个參数,当中一个是字符的类型,一个是与字符类型相关的信息
    就像std::cout一样输出各种类型,编译器自己会进行正确的推导输出的什么类型。

    static const char* const 表示数组里面的指针不可改变  并且指针所指向的字符串也不可改变

    三 日志输出位置

    logging::add_console_log
    日志输出到控制台


     logging::add_file_log
    日志输出到文件


    四 定义源。像std::cout一样输出

    src::logger lg;

    BOOST_LOG(lg) << "Hello, World!";

    五 结果

    文件的输出

    2014-11-05, 19:46:19.513082 [00:00:00] 
    [int __cdecl wmain(int,char *[]) (文件路径:代码行)] <warning> A warning severity message, will pass to the file


    2014-11-05, 19:46:19.518082 [00:00:00] 
    [int __cdecl wmain(int,char *[]) (文件路径:代码行)] <error> An error severity message, will pass to the file


    控制台的输出

    2014-Nov-05 19:51:30.261856: Hello, World!
    2014-Nov-05 19:51:30.268856: A normal severity message, will not pass to the file
    2014-Nov-05 19:51:30.275856: A warning severity message, will pass to the file
    2014-Nov-05 19:51:30.284857: An error severity message, will pass to the file

    转载于:https://www.cnblogs.com/gavanwanggw/p/6911593.html

  • 相关阅读:
    生产者消费者问题--进阶
    互斥量和信号量的区别
    linux多线程大神博客网址
    生产者消费者
    文件互斥
    Linux中link,unlink,close,fclose详解
    条件变量
    哲学家进餐问题-3中解决方案
    使用读写锁解决读者-写者问题
    架构漫谈(三):如何做好架构之识别问题
  • 原文地址:https://www.cnblogs.com/twodog/p/12140443.html
Copyright © 2011-2022 走看看