Boost Log 基本用法

Boost Log 基本用法

flyfish 2014-11-5

根据boost提供的代码示例,学习Boost Log 的基本用法

前提

boost版本boost_1_56_0

示例代码文件夹 boost_1_56_0\libs\log\example\basic_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

时间: 2024-11-07 20:08:45

Boost Log 基本用法的相关文章

boost.log要点笔记

常用简写: namespace logging = boost::log; namespace src = boost::log::sources; namespace expr = boost::log::expressions; namespace sinks = boost::log::sinks; namespace attrs = boost::log::attributes; namespace keywords = boost::log::keywords; 要点: 结构图要牢记在

Boost Log : Attributes

Adding more information to log: Attributes 在前面的章节中,我们多次提到了属性和属性值.在这里,我们将发现如何使用属性向日志记录添加更多的数据. 每一个日志记录都可以包含许多命名的属性值.属性可以表示任何关于日志记录发生的条件的基本信息,比如代码中的位置,可执行的模块名,当前日期和时间,或者任何与您的特定应用程序和执行环境相关的数据.一个属性可以表现为一个值生成器,在这种情况下,它会为它所涉及的每个日志记录返回一个不同的值.只要属性生成该值,后者就会独立

boost.log在项目中应用

#pragma once #include <string> #include <boost/log/trivial.hpp> using std::string; #define LOG_DEBUG\ BOOST_LOG_SEV((MyLog::s_slg),(boost::log::trivial::debug)) #define LOG_INFO\ BOOST_LOG_SEV((MyLog::s_slg),(boost::log::trivial::info)) #defin

boost.log 的使用

在编译boost.log 的示例程序时,遇到了下面的错误: zhifan$ make boost_log LDFLAGS='-lboost_log-mt' Undefined symbols for architecture x86_64: "boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)", re

boost的posix_time用法详解01

// boost_time.cpp : 定义控制台应用程序的入口点. //made by davidsu33 //2014-5-11 //the usage of posix_time #include "stdafx.h" #include <boost/date_time/posix_time/posix_time.hpp> #include <iostream> #include <cassert> using namespace std; #

Boost log 简单使用

Boost log 简单使用 flyfish 2014-11-8 该示例是在VC2010 MFC Unicode环境下使用 内容包括 1 启动关闭日志 2 设置日志存储路径 3 设置输出日志等级 4 日志是否立即写入文件 5 设置单个文件的大小 6 设置磁盘最小可利用空间 Logger.h #pragma once #include <cassert> #include <iostream> #include <fstream> #include <boost/l

boost.log(九) 配置文件

前面几节中描述了Boost.Log 的基础知识,对Boost.Log 库的操作我们都是在C++代码中进行中,这样就会有一些不便的地方.比如说我们想要更改一下输出格式或者过滤条件,都必须对C++代码进行更改,并且还得编译一次(感觉编译时间还有点长).其实Boost.Log 里面已经为这个问题提供了一种解决方案,就是通过配置文件来初始化Boost.Log 库,C++这边的代码也比较简单,就是这样的: std::ifstream settings("settings.txt"); if (!

boost.log(八)宽字符记录

宽字符记录 Boost.Log支持包含本地字符集字符串的日志记录.基本上有两种方式做这件事.在 UNIX 系统上通常使用一些多字节字符编码 (例如 UTF-8) 用来表示本地字符.在这种情况下,Boost.Log库可以直接以纯 ASCII 的方式记录而不需要其它额外的设置. 在Windows 上常见的做法是使用宽字符串来表示本地字符串.此外大多数系统 API 也是使用的宽字符,这需要特定于 Windows 的接收器也支持宽字符.另一方面,通用的接收器,例如 TextFile,是面向字节的,你写入

boost.log(七)再谈过滤

再谈过滤 我们已经在前面的章节接触过滤,但只是浅尝辄止.我们现在能够添加日志记录并设置接收器的属性,我们需要建立复杂的过滤功能.让我们看下这个例子: #include <string> #include <fstream> #include <iomanip> #include <boost/log/core.hpp> #include <boost/smart_ptr.hpp> #include <boost/log/sinks.hpp&