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. VS插件神器 ReShaper入门

    @简介: 1,Resharper提供以下6个核心功能,分别是: (1). 代码分析(Code Analysis):智能提示代码中存在的问题和修复建议. (2). 编码助手(Coding Assista ...

  2. JavaScript 操作JSON总结

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  3. SQL优化,解决系统运行效率瓶颈

    http://www.cnblogs.com/SameZhao/p/4737725.html

  4. Python笔记 #01# Convert Python values into any type

    源:DataCamp datacamp 的 DAILY PRACTICE  + 日常收集. How much is your $100 worth after 7 years? Guess the t ...

  5. 【MSDN_C#】C#版本介绍

    C# 1,Visual Studio .NET 2002 首次发布 C# 1.1,Visual Studio .NET 2003 #line 杂注和 xml 文档注释 C# 2,Visual Stud ...

  6. mysql left join中where和on条件的区别

    left join中关于where和on条件的几个知识点: 1.多表left join是会生成一张临时表,并返回给用户 2.where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件 ...

  7. 再也不学AJAX了!(二)使用AJAX

    在上一篇文章中我们知道,AJAX是一系列技术的统称.在本篇中我们将更进一步,详细解释如何使用Ajax技术在项目中获取数据.而为了解释清楚,我们首先要搞清楚我们是从哪里获取数据的,其次我们关注的才是获取 ...

  8. 4.scala中的类

    版权申明:转载请注明出处.文章来源:http://bigdataer.net/?p=269 排版乱?请移步原文获得更好的阅读体验 1.针对不同字段生成的方法 字段生成的方法备注 var/val nam ...

  9. JVM 内存调优 与 实际案例

    堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...

  10. vue的seo方案 prerender-seo-plugin

    利用vue cli 3.0安装脚手架.记住:勾选vue-router. 在vue.config.js里添加配置: 2, var path = require('path') 3, const Prer ...