1. 简单介绍

log4cplus是C++编写的开源的日志系统,The
purpose of this project is to port the excellent
Log
for Java
 (log4j)logging library to C++

log4cplus具有灵活、强大、使用简单、多线程安全的特点,实在是杂牌军、游击队的福音。



2. 安装使用(Linux)

log4cplus安装使用很easy。从其官网:http://log4cplus.sourceforge.net/ 下载最新版本号

执行:

tar xvzf log4cplus-x.x.x.tar.gz

cd log4cplus-x.x.x

./configure --prefix=/where/to/install

make

make install

在安装文件夹下生成include和lib两个文件夹。分别为头文件和库文件

使用:

g++ -o server   /mnt/hgfs/work_vm/project/work_project/server/obj/main.o  
-L../..//third/log4cplus/lib/ -L../..//third/boost/lib/-llog4cplus
-lpthread -I/mnt/hgfs/work_vm/project/work_project/server/include -I../..//third/log4cplus/include/-I../..//third/boost/include/

编译參数:

-L../..//third/log4cplus/lib/

-llog4cplus 

-lpthread

-I../..//third/log4cplus/include/



3. 使用

log4cplus主要包含layout、appender、loglevel等内容。能够參考:

http://masterdog.bokee.com/153892.html

写的很nice



4. 包装

logcplus包装下用起来很方便,下面是我的包装。供參考

Log.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//
Log.h: interface for the Log class.
//
//////////////////////////////////////////////////////////////////////
 
#if
!defined(AFX_LOG_H__B87F71E3_FFAE_4CFA_A528_3F4F2FF7D69E__INCLUDED_)
#define
AFX_LOG_H__B87F71E3_FFAE_4CFA_A528_3F4F2FF7D69E__INCLUDED_
 
#include
"log4cplus/loglevel.h"
#include
"log4cplus/ndc.h"
#include
"log4cplus/logger.h"
#include
"log4cplus/configurator.h"
#include
"iomanip"
#include
"log4cplus/fileappender.h"
#include
"log4cplus/layout.h"
 
#include
"const.h"
#include
"common.h"
#include
"Main_config.h"
 
using

namespace

log4cplus;
using

namespace

log4cplus::helpers;
 
//日志封装
#define
TRACE(p) LOG4CPLUS_TRACE(Log::_logger, p)
#define
DEBUG(p) LOG4CPLUS_DEBUG(Log::_logger, p)
#define
NOTICE(p) LOG4CPLUS_INFO(Log::_logger, p)
#define
WARNING(p) LOG4CPLUS_WARN(Log::_logger, p)
#define
FATAL(p) LOG4CPLUS_ERROR(Log::_logger, p)
 
//
日志控制类,全局共用一个日志
class

Log
{
public:
    //
打开日志
    bool

open_log();
 
    //
获得日志实例
    static

Log& instance();
     
    static

Logger _logger;
 
private:
    Log();
 
    virtual

~Log();
 
    //log文件路径及名称
    char

_log_path[PATH_SIZE];
    char

_log_name[PATH_SIZE];
};
 
#endif
// !defined(AFX_LOG_H__B87F71E3_FFAE_4CFA_A528_3F4F2FF7D69E__INCLUDED_)

Log.cpp:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//
Log.cpp: implementation of the Log class.
//
//////////////////////////////////////////////////////////////////////
 
#include
"Log.h"
 
//////////////////////////////////////////////////////////////////////
//
Construction/Destruction
//////////////////////////////////////////////////////////////////////
 
Logger
Log::_logger = log4cplus::Logger::getInstance(
"main_log");
 
Log::Log()
{
    snprintf(_log_path, sizeof(_log_path), "%s""../log");
    snprintf(_log_name, sizeof(_log_name), "%s/%s.%s",
_log_path, execname, 
"log");
}
 
Log::~Log()
{
}
 
Log&
Log::instance()
{
    static

Log 
log;
    return

log
;
}
 
bool

Log::open_log()
{
     
    int

Log_level = Main_config::instance().get_config().Read(
"LOG_LEVEL",
0); 
 
    /*
step 1: Instantiate an appender object */
    SharedAppenderPtr
_append(
new

FileAppender(_log_name));
    _append->setName("file
log test"
);
 
    /*
step 2: Instantiate a layout object */
    std::string
pattern = 
"[%p]
[%d{%m/%d/%y %H:%M:%S}] [%t] - %m %n"
;
    std::auto_ptr<Layout>
_layout(
new

PatternLayout(pattern));
 
    /*
step 3: Attach the layout object to the appender */
    _append->setLayout(_layout);
 
    /*
step 4: Instantiate a logger object */
 
    /*
step 5: Attach the appender object to the logger  */
    Log::_logger.addAppender(_append);
 
    /*
step 6: Set a priority for the logger  */
    Log::_logger.setLogLevel(Log_level);
 
    return

true
;
}

int Log_level = Main_config::instance().get_config().Read("LOG_LEVEL", 0);

Main_config是我自己包装的一个配置类(參考:http://blog.csdn.net/yfkiss/article/details/6802451)。通过读取配置设置log level。

使用:

#inlucde "Log.h"

程序初始化的时候:

    // 打开日志

    if (!Log::instance().open_log())

    {

        std::cout << "Log::open_log() failed" << std::endl;

        return false;

    }

然后使用NOTICE、FATAL等就能够打印日志到文件。

?
1
2
3
4
5
6
7
8
9
10
11
#include
"Log.h"
....
    //
打开日志
    if

(!Log::instance().open_log())
    {
        std::cout
<< 
"Log::open_log()
failed"

<< std::endl;
        return

false
;
    }
.....
NOTICE("Server
init succ"
);
FATAL("Server
run failed"
);

转自:http://blog.csdn.net/yfkiss/article/details/6802422

log4cplus的安装与使用初步的更多相关文章

  1. php框架中的phalcon框架的安装,及初步认识,从表单提交简单的数据到数据库中

    php框架中的phalcon框架的安装,及初步认识,从表单提交简单的数据到数据库中 1.phalcon框架的安装: phalcon框架在windows本地安装可以利用wamp软件,安装之后可以查看对应 ...

  2. Microsoft Visual Studio 2010下log4cplus的安装,集成,测试

    原文:http://blog.csdn.net/eclipser1987/article/details/6904301 log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工 ...

  3. drf安装与APIView初步分析

    drf安装 1. pip install djangorestframework 2. 在settings文件中注册app : INSTALLED_APPS = [..., 'rest_framewo ...

  4. windows环境安装haproxy及初步配置负载均衡使用示例

    安装HaProxy 首先需要下载windows环境下需要文件,这里下载的是一个别人编译好的一个文件,这里省去了编译的过程,使用的版本是haproxy-1.7.8. 下载后直接解压到对应的目录下.示例( ...

  5. node安装 教程 + git初步

    我的系统是win8.1   64位 这个是对应的安装包:http://files.cnblogs.com/files/zxyun/node-v0.12.5-x64.zip 安装中有不懂可以参考下面的两 ...

  6. linux下安装nginx及初步认识

    linux下安装配置nginx nginx:是一个高性能的反向代理服务器正向代理代理的是客户端,反向代理代理的是服务端. 这里以nginx-1.12.2版本为例子 1.首先去官网下载nginx-1.1 ...

  7. 全网最详细的Windows系统里Oracle 11g R2 Client客户端(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Client(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cmd— ...

  8. 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)安装后的初步使用(图文详解)

    不多说,直接上干货! 前期博客 全网最详细的Windows系统里Oracle 11g R2 Database(64bit)的下载与安装(图文详解) 命令行方式测试安装是否成功 1)   打开服务(cm ...

  9. 前端新手如何安装webstorm ,初步搭建react项目

    下载安装webstorm:配置成功: 配置成功后就可以开启webstorm项目了.(存微信收藏..) 1:在webstorm下配置node环境: 2:完成之后: React官方脚手架地址: https ...

随机推荐

  1. noip2012疫情控制 题解

    题目大意 给出一棵n个节点的树,根是1,要在除根节点以外的点建立检查点,使得从每条根到叶子的路径上都至少存在一个检查点.检查点由军队来建立.初始军队的位置是给定的,移动军队走一条边需要花费这条边的权值 ...

  2. 【推导】【线段树】hdu5929 Basic Data Structure

    题意: 维护一个栈,支持以下操作: 从当前栈顶加入一个0或者1: 从当前栈顶弹掉一个数: 将栈顶指针和栈底指针交换: 询问a[top] nand a[top-1] nand ... nand a[bo ...

  3. HDU 5575 Discover Water Tank 并查集 树形DP

    题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...

  4. PAT甲级1089. Insert or Merge

    PAT甲级1089. Insert or Merge 题意: 根据维基百科: 插入排序迭代,消耗一个输入元素每次重复,并增加排序的输出列表.每次迭代,插入排序从输入数据中删除一个元素,在排序列表中找到 ...

  5. mp4网页播放代码,有声音无图像的解决办法~

    mp4网页播放代码,有声音无图像的解决办法~     关于网页播放mp4格式的视频,找了一些插件,这里推荐一下video.js 官方网址:http://www.videojs.com/ github ...

  6. javascript:window.history.forward(1);

    javascript:window.history.forward(1);[转] 接下来我们要讨论的方法以后退按钮本身为中心,而不是浏览器缓存.这儿有一篇文章Rewiring the Back But ...

  7. iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET

    iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET Weex

  8. OC中NSLog函数输出格式详解

    OC中NSLog函数输出格式详解 %@ 对象 • %d, %i 整数 • %u 无符整形 • %f 浮点/双字 • %x, %X 二进制整数 • %o 八进制整数 • %zu size_t • %p ...

  9. How to implement *All-Digital* analog-to-digital converters in FPGAs and ASICs

    When we engineers look at the complexity of system design these days, we are challenged with crammin ...

  10. 借助JRebel使Tomcat支持热部署

    JRebel是一个J2EE热部署的工具.使用它可以减少浪费8-18%的开发时间在项目的构建和部署上.虽然Java也提供了HotSpot的JVM,但是如果你修改的类中有方法名称变动的话,HotSpot就 ...