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. BZOJ 3626: [LNOI2014]LCA 树链剖分 线段树 离线

    http://www.lydsy.com/JudgeOnline/problem.php?id=3626 LNOI的树链剖分题没有HAOI那么水,学到的东西还是很多的. 我如果现场写,很难想出来这种题 ...

  2. 【最大化平均值】POJ3111-K Best

    [题目大意] 给出v[]和w[],求的最大值. [思路] 二分s(S)的值,可变形为s(S)*Σw>=Σv,所以只需要把求出x*w[i]-v[i],看看前k个的和是否大于等于0,大于等于0就满足 ...

  3. bzoj 1857

    三分,对于单凸的函数(单调的也可以),可以找出最值. 这道题可以感性认识一下...... /****************************************************** ...

  4. PHP -- 8个必备的PHP功能开发

    原文出处:http://www.codeceo.com/8-php-functions.html 做过PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得 ...

  5. [转][Android] ListView中getView的原理+如何在ListView中放置多个item

      ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果 ...

  6. mysql root密码忘了怎么办?

    服务器多起来,密码也就多了,多到自己记不住了,也忘记存哪里了.昨天刚刚下载了KeePass来管理密码,不过为时已晚,我已经忘记了mysql的root密码.好惨好惨,难道还要重装么.还好,有一种方法可以 ...

  7. LINUX 高可用群集之 ~Corosync~

    Corosync:它属于OpenAIS(开放式应用接口规范)中的一个项目corosync一版本中本身不具 备投票功能,到了corosync 2.0之后引入了votequorum子系统也具备了投票功能了 ...

  8. es6 箭头函数 this 问题

    1. 在箭头函数出现之前,每个新定义的函数都有其自己的this值(例如,构造函数的 this 指向了一个新的对象:严格模式下的函数的 this 值为 undefined:如果函数是作为对象的方法被调用 ...

  9. ELM320 OBD(PWM) to RS232 Interpreter

    http://elmelectronics.com/DSheets/ELM320DS.pdf

  10. cherokee +php fastcgi 出现 No input file specified 故障一例

    在arch上编译cherokee 时用的--with-wwwroot=/srv/http.在建立虚拟服务器时,只要虚拟服务器的根目录位于/srv/http下,php页面都能正确运行.但只要将拟服务器的 ...