log4cpp第一个程序HelloWord
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的更多相关文章
- java学习 之 第一个程序及认识
以前也看过一系列的java方面的程序,但是还没有正式敲过,今天正式学习并且正式敲出代码.在这里记录下来今日所得 写作工具:Notepad++ 在写作工具方面好多人建议用 记事本,但是我还是认为用 No ...
- Python 学习笔记(六)Python第一个程序
Python 语句 赋值语句 1.将3对象赋值给了变量a 2.将3,4赋值给了变量a,b >>> a = 3 >>> a ,b = 3,4 >>> ...
- Android开发-之第一个程序:HelloWorld!
小编觉得不管学习什么编程的时候,第一个程序都是要求打印输出一个"HelloWorld!",那就从最简单的HelloWorld开始吧!哈哈~~~~ 一.创建一个Android工程 1 ...
- [Fluent NHibernate]第一个程序
目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...
- rails再体验(第一个程序)
掌握redmine plugin开发的目标在2016年未实现,2017年继续. 选择<Ruby on Rails Tutorial>教程,windows安装railsinstaller,该 ...
- OpenGL学习笔记1——第一个程序
学习的参考书基本是按照GL编程指南,如果有消息机制概念,对于GLUT的理解是很自然的.下面就按照自己写的第一个程序详细解释一下GL,还是比较容易上手的. 程序实现的功能是,根据当前随即种子摇出来的结果 ...
- Android 第一个程序 及 环境搭配
一. JDK配置 1.找到jdk安装路径 2.配置环境变量(建议配置在系统变量里面) 1).配置JAVA_HOME变量 2).配置 CLASSPATH 环境变量 CLASSPATH=.;%JAVA_H ...
- unix 网路编程(卷一)第一个程序编译过程
unix卷一去年暑假买的到现在才开始看无比惭愧,而且惭愧第一个程序就断断续续弄了几天,要好好写程序了,马上要找工作了,下面介绍下把本书第一个程序跑起来的过程: 搜各种博客 我用系统的是ubuntu 1 ...
- Hadoop学习历程(三、第一个程序)
根据之前的操作,我们已经可以正常的启动Hadoop了,关于真正的集群我会在之后进行说明.现在我们来看一下第一个程序吧 1. 在eclipse上建立一个java项目 2. 将 /usr/hadoop/s ...
随机推荐
- JAVA中UDP使用
UDP协议 在有些应用程序中,保持最快的速度比保证每一位数据都正确到达更重要.例如,在实时音频或视频中,丢失数据包只会作为干扰出现.干扰是可以容忍的,但当TCP请求重传或等待数据包到达而它却迟迟不到时 ...
- QML中的state 状态
QML中的状态其实很好理解,任何事物在某一事件都是有一个状态的. 比如你看到的一个窗口,这个时候里面的文字和图片正处于某个状态中.比如一个超链接,你点击了,发现颜色变了,你按了Ctrl+A,整个窗体好 ...
- Spark高级数据分析· 3推荐引擎
推荐算法流程 推荐算法 预备 wget http://www.iro.umontreal.ca/~lisa/datasets/profiledata_06-May-2005.tar.gz cd /Us ...
- 利用C++调用天气webservice-gSOAP方法
首先需要下载一个gSOAP工具包 下载路径为:https://sourceforge.NET/projects/gsoap2/ 至于有关于gSOAP的一些用法和包含的文件的说明可从官网查看:http: ...
- 20145214 《Java程序设计》第3周学习总结
教材学习内容总结 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制 从类看对象:类定义可以视 ...
- Net_Prop 之 CTerrorPlayer 属性
Sub-Class Table (1 Deep): DT_TerrorPlayer Sub-Class Table (2 Deep): DT_CSPlayer Sub-Class Table (3 D ...
- c#结构体和字节流之间的相互转换
结构体转byte数组 1 首先要明白 ,是 在那个命名空间下 System.Runtime.InteropServices; 2 首先得到结构体的大小 2 开辟相应的内存空间 3 将结构体填 ...
- 学Git,用Git ①
本月开始接触到Git版本管理工具,觉得很有意思,在这里总结一下学习Git的一些心得体会. 要在Mac上完整的使用git进行版本管理,需要熟悉Mac终端操作命令和Git操作命令两种命令,索性两种命令加在 ...
- webservice获取天气信息
效果 1.eclipse中新建一个Java项目 2.通过命名获取天气的客户端信息 首先,打开天气网站http://ws.webxml.com.cn/WebServices/WeatherWS.asmx ...
- 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, 判断读入的数是不是满足 这次依然只是做了 ...