body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

让我们从一个简单的例子开始,该例子将两条日志信息写入字符串流,该流会在标准控制台cout上输出,项目的名称是HelloLog4Cpp:

//步凑:
//1. 创建一个Appender,并指定其包含的Layout;
//2. 从系统中得到Category的根,将Appender添加到该Category中;
//3. 设置Category的优先级;
//4. 记录日志;
//5. 关闭Category。


#include <iostream>
#include <log4cpp/Category.hh>               //负责向日志中写入信息
#include <log4cpp/OstreamAppender.hh>        //负责指定日志的目的地
#include <log4cpp/BasicLayout.hh>            //负责设定日志的格式
#include <log4cpp/Priority.hh>               //指定Category的优先级和日志的优先级
using namespace std;
using namespace log4cpp;
int main(void)
{
//指定日志输出目的地
        OstreamAppender * pOstremAppender =
                new OstreamAppender("osAppender", &cout);
//设置格式化日志信息
        pOstremAppender->setLayout(new BasicLayout());
//负责输出日志
        Category & root = Category::getRoot();
        root.addAppender(pOstremAppender);
        root.setPriority(Priority::ERROR);
//写日志
        root.error("hello log4cpp in a Error Message!");
        root.warn("hello log4cpp in a warn Message!");
//关闭Category
        Category::shutdown();
        return 0;
}

//系统中可以有多个Category,它们都继承自同一个跟root,每个Category负责记录自己的日志;
//每个Category可以添加多个Appender(目的地,日志要输出到哪),每个Appender制定了一个日志的目的地;
//这个目的地可以是文件,字符流或者windws日志,当Category记录一条日志时,该日志被写入所有
//附加到此Category的Appender;
//每个Append都包含一个Layout,该Layout定义了这个Appender上日志的格式。
//
#include<iostream>
#include<log4cpp/Category.hh>
#include<log4cpp/OstreamAppender.hh>
#include<log4cpp/BasicLayout.hh>
#include<log4cpp/Priority.hh>
using namespace std;
//引入命名空间log4cpp就可以不用加作用名限定log4cpp::
int main(int argc,char *argv[])
{
        //指定日志输出目的地;附加目的地,cout,输出终端;堆对象,防止超出作用域被释放
        log4cpp::OstreamAppender* osAppender = new log4cpp::OstreamAppender("osAppender",&cout);
        //设置格式化日志信息;设置APPender的布局
        osAppender->setLayout(new log4cpp::BasicLayout());
        //负责输出日志;得到系统的根root
        log4cpp::Category& root = log4cpp::Category::getRoot();
        //把设置好的Append添加到系统root下
        root.addAppender(osAppender);
        root.setPriority(log4cpp::Priority::DEBUG);
        //写日志
        root.error("Hello log4cpp in a Error Message!");
        root.warn("Hello log4cpp in a Warning Message!");
        //关闭日志
        log4cpp::Category::shutdown();
        return 0;
}
//1514104975 ERROR  : Hello log4cpp in a Error Message!
//1514104975 WARN  : Hello log4cpp in a Warning Message!
编译:g++ helloworld.cpp -o helloworld -llog4cpp -lpthread
运行结果:1248337987 ERROR : Hello log4cpp in a Error Message!
                 1248337
注:以上两条日志格式很简陋,要设置合乎心意的日志格式,请参考后续的PatternLayout章节。

相关概念:

  Log4cpp中的概念继承自log4j,最重要的是Category(种类)、Appender(附加目的地)和Layout(布局)三个概念,此外还有Priority(优先级)和NDC(嵌套的诊断上下文)等。

 简言之,Category负责向日志中写入信息,Appender负责指定日志的目的地,Layout负责设定日志的格式,Priority被用来指定Category的优先级和日志的优先级, NDC则是一种用来区分不同场景中交替出现的日志的手段。

  Log4cpp记录日志的原理如
下:每个Category都有一个优先级,该优先级可以由setPriority方法设置,或者从其父Category中继承而来。每条日志也有一个优先级,当Category记录该条日志时,若日志优先级高于Category的优先级时,该日志被记录,否则被忽略。系统中默认的优先级等级如下:

typedef enum { EMERG  = 0,
               FATAL  = 0,
               ALERT  = 100,
               CRIT   = 200,
               ERROR  = 300,
               WARN   = 400,
               NOTICE = 500,
               INFO   = 600,
               DEBUG  = 700,
               NOTSET = 800
     } PriorityLevel;

  注意:取值越小,优先级越高。例如一个Category的优先级为101,则所有EMERG、FATAL、ALERT日志都可以记录下来,而其他则不能。

  Category、
Appender和Layout三者的关系如下:系统中可以有多个Category,它们都是继承自同一个根,每个Category负责记录自己的日志;
每个Category可以添加多个Appender,每个Appender指定了一个日志的目的地,例如文件、字符流或者Windows日志,当
Category记录一条日志时,该日志被写入所有附加到此Category的Appender;每个Append都包含一个Layout,该
Layout定义了这个Appender上日志的格式。

  现在重温前面的HelloWorld程序,可以发现其流程如下:

    1. 创建一个Appender,并指定其包含的Layout;
    2. 从系统中得到Category的根,将Appender添加到该Category中;
    3. 设置Category的优先级;
    4. 记录日志;
    5. 关闭Category。

  下面,我们按照Layout、Appender、Category、NDC的顺序来依次介绍这些概念并给出例子。

log4cpp第一个程序HelloWord的更多相关文章

  1. java学习 之 第一个程序及认识

    以前也看过一系列的java方面的程序,但是还没有正式敲过,今天正式学习并且正式敲出代码.在这里记录下来今日所得 写作工具:Notepad++ 在写作工具方面好多人建议用 记事本,但是我还是认为用 No ...

  2. Python 学习笔记(六)Python第一个程序

    Python 语句 赋值语句 1.将3对象赋值给了变量a 2.将3,4赋值给了变量a,b >>> a = 3 >>> a ,b = 3,4 >>> ...

  3. Android开发-之第一个程序:HelloWorld!

    小编觉得不管学习什么编程的时候,第一个程序都是要求打印输出一个"HelloWorld!",那就从最简单的HelloWorld开始吧!哈哈~~~~ 一.创建一个Android工程 1 ...

  4. [Fluent NHibernate]第一个程序

    目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...

  5. rails再体验(第一个程序)

    掌握redmine plugin开发的目标在2016年未实现,2017年继续. 选择<Ruby on Rails Tutorial>教程,windows安装railsinstaller,该 ...

  6. OpenGL学习笔记1——第一个程序

    学习的参考书基本是按照GL编程指南,如果有消息机制概念,对于GLUT的理解是很自然的.下面就按照自己写的第一个程序详细解释一下GL,还是比较容易上手的. 程序实现的功能是,根据当前随即种子摇出来的结果 ...

  7. Android 第一个程序 及 环境搭配

    一. JDK配置 1.找到jdk安装路径 2.配置环境变量(建议配置在系统变量里面) 1).配置JAVA_HOME变量 2).配置 CLASSPATH 环境变量 CLASSPATH=.;%JAVA_H ...

  8. unix 网路编程(卷一)第一个程序编译过程

    unix卷一去年暑假买的到现在才开始看无比惭愧,而且惭愧第一个程序就断断续续弄了几天,要好好写程序了,马上要找工作了,下面介绍下把本书第一个程序跑起来的过程: 搜各种博客 我用系统的是ubuntu 1 ...

  9. Hadoop学习历程(三、第一个程序)

    根据之前的操作,我们已经可以正常的启动Hadoop了,关于真正的集群我会在之后进行说明.现在我们来看一下第一个程序吧 1. 在eclipse上建立一个java项目 2. 将 /usr/hadoop/s ...

随机推荐

  1. JAVA中UDP使用

    UDP协议 在有些应用程序中,保持最快的速度比保证每一位数据都正确到达更重要.例如,在实时音频或视频中,丢失数据包只会作为干扰出现.干扰是可以容忍的,但当TCP请求重传或等待数据包到达而它却迟迟不到时 ...

  2. QML中的state 状态

    QML中的状态其实很好理解,任何事物在某一事件都是有一个状态的. 比如你看到的一个窗口,这个时候里面的文字和图片正处于某个状态中.比如一个超链接,你点击了,发现颜色变了,你按了Ctrl+A,整个窗体好 ...

  3. Spark高级数据分析· 3推荐引擎

    推荐算法流程 推荐算法 预备 wget http://www.iro.umontreal.ca/~lisa/datasets/profiledata_06-May-2005.tar.gz cd /Us ...

  4. 利用C++调用天气webservice-gSOAP方法

    首先需要下载一个gSOAP工具包 下载路径为:https://sourceforge.NET/projects/gsoap2/ 至于有关于gSOAP的一些用法和包含的文件的说明可从官网查看:http: ...

  5. 20145214 《Java程序设计》第3周学习总结

    教材学习内容总结 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制 从类看对象:类定义可以视 ...

  6. Net_Prop 之 CTerrorPlayer 属性

    Sub-Class Table (1 Deep): DT_TerrorPlayer Sub-Class Table (2 Deep): DT_CSPlayer Sub-Class Table (3 D ...

  7. c#结构体和字节流之间的相互转换

    结构体转byte数组 1  首先要明白 ,是 在那个命名空间下  System.Runtime.InteropServices; 2  首先得到结构体的大小 2  开辟相应的内存空间 3  将结构体填 ...

  8. 学Git,用Git ①

    本月开始接触到Git版本管理工具,觉得很有意思,在这里总结一下学习Git的一些心得体会. 要在Mac上完整的使用git进行版本管理,需要熟悉Mac终端操作命令和Git操作命令两种命令,索性两种命令加在 ...

  9. webservice获取天气信息

    效果 1.eclipse中新建一个Java项目 2.通过命名获取天气的客户端信息 首先,打开天气网站http://ws.webxml.com.cn/WebServices/WeatherWS.asmx ...

  10. 2017 ACM/ICPC Asia Regional Qingdao Online - 1011 A Cubic number and A Cubic Number

    2017-09-17 17:12:11 writer:pprp 找规律,质数只有是两个相邻的立方数的差才能形成,公式就是3 * n * (n + 1) +1, 判断读入的数是不是满足 这次依然只是做了 ...