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. [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)

    对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多 ...

  2. [BZOJ2402]陶陶的难题II(树链剖分+线段树维护凸包+分数规划)

    陶陶的难题II 时间限制:40s      空间限制:128MB 题目描述 输入格式 第一行包含一个正整数N,表示树中结点的个数. 第二行包含N个正实数,第i个数表示xi (1<=xi<= ...

  3. 欧拉路小结 JZYZOJ1210 骑马修栅栏

    现在写到欧拉路,理解起来并不算特别困难...吧... 但是非常恶心的是每次都要调试半天,做不到一遍两遍就能ac 每次写程序都对于程序的整体构架没有清晰的思路,想到哪里写到哪里真的是个非常差的习惯[尽管 ...

  4. 【最小生成树】BZOJ1682[Usaco2005 Mar]-Out of Hay 干草危机

    ...最小生成树裸题,9月最后一天刷水刷水. #include<iostream> #include<cstdio> #include<algorithm> usi ...

  5. [转]Android中常用适配器及定义自己的适配器

      一,适配器. 顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示.可以看作是界面数据绑定的一种理解.它所操纵的数据一般都是一些比较复杂的数据,如数组,链表, 数据库,集合等.适配器就像 ...

  6. Delphi TFileStream 打开模式与共享模式

    { TFileStream create mode } fmCreate = $FF00; { Create a file with the given name. If a file with th ...

  7. VS 2017 取消结构参考线的显示

    Visual studio 中的结构参考线如下所示 其可以通过如下方式取消:

  8. (原)将Oracle迁移到SQLServer

    背景:中了一个标,Oracle改成SQLServer解决办法: 1.首先想到微软的解决方案:Microsoft SQL Server Migration Assistant v7.4 for Orac ...

  9. Single Number and Single Number II

    [] Given an array of integers, every element appears twice except for one. Find that single one. [] ...

  10. USACO ariprog 暴力枚举+剪枝

    /* ID:kevin_s1 PROG:ariprog LANG:C++ */ #include <iostream> #include <cstdio> #include & ...