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 ...
随机推荐
- 理解android分辨率限定符 layout-sw360dp
首先,我们来看看单位dp是怎么一回事,dp是一种单位,使用它,你可以在高.低分辨率上获得一样的空间表现,也就是说,它是像素无关的. dp计算公式:160*pix/ppi(pix是你要计算的高度或者宽度 ...
- c++之旅:操作符重载
操作符重载 操作符重载可以为操作符添加更多的含义,操作符重载的作用的对象是类 那些操作符可以重载 除了下面几个操作符不能重载外,其它的操作符都能重载 . :: .* ?: sizeof 操作符重载的本 ...
- shell 脚本中双引号 单引号 反引号 的区别
转自:http://blog.csdn.net/iamlaosong/article/details/54728393 最近要编个shell脚本处理数据,需要检测数据文件是否存在,文件名中包含日期,所 ...
- Web前端页面的浏览器兼容性测试心得(一)搭建测试用本地静态服务器
自从实习以来,我体验了由一个人编程再到多人协作编程的转换.同时也接触了很多新鲜事物,学到了很多东西.工作时,常常需要多个人协同测试一张H5页面(PC.手机.平板等跨设备测试),也会经常把页面给PM或老 ...
- 【二分+SPFA】修建道路(road)
(四五年以前的老草稿,作为强迫症还是发布出来吧) 修建道路(road.pas/c/cpp) [问题描述] NOIP2012的参赛者LG异想天开打算修建一条磁悬浮列车的通道连接现代OI王国的首都(编号为 ...
- Hexo博客部署codingNet静态资源无法加载
用Hexo搭建的个人博客,部署到github的pages的话,好像百度搜索不到.所以在国内的codingNet的pages服务也一起部署一下,这样方便国内国外搜索引擎收录进来.具体部署教程我是参考这里 ...
- 制作RPM包
RPM包制作过程 1.1 前期工作 1)创建打包用的目录rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS} 建议使用普通用户,在用户家目录中创建 2)确定好制作的对象 ...
- 20145310 《Java程序设计》第9周学习总结
20145310 <Java程序设计>第9周学习总结 教材学习内容总结 本周主要进行第十六章和第十七章的学习. JDBC全名Java DataBase Connectivity,是java ...
- 20145314郑凯杰《信息安全系统设计基础》第9周学习总结 PART B
20145314郑凯杰<信息安全系统设计基础>第9周学习总结 PART B 明确教材学习目标 注意每个系统调用的参数.返回值,会查帮助文档 阅读教材,完成课后练习(书中有参考答案),考核: ...
- Ubuntu 使用root登陆界面
打开终端开启root账户 :sudo passwd -u root 输入当前用户的密码 2.为root账户设置密码:sudo passwd root 设置root密码,输入两次 3.进入到/usr/s ...