1. 主页:http://log4cpp.sourceforge.net
“Log4cpp is library of C++ classes for flexible logging to files, syslog, IDSA and other destinations. It is modeled after the Log4j Java library, staying as close to their API as is reasonable.”

api文档地址:http://log4cpp.sourceforge.net/api/hierarchy.html

2.下载安装
环境:ubuntu 14.04 LTS,gcc 4.8.4

下载源码包 log4cpp-1.1.2rc1.tar.gz
$tar xzvf log4cpp-1.1.2rc1.tar.gz
$cd log4cpp
$./configure --with-pthreads
$make
$make check
$make install

安装完成后,头文件在/usr/local/include/log4cpp,库安装在/usr/local/lib/,文件名liglog4cpp.so.5.0.6,还有几个符号链接

3.测试
测试代码 main.cpp

#include "log4cpp/Category.hh"
#include "log4cpp/PropertyConfigurator.hh" int main(int argc, char* argv[])
{
std::string initFileName = "log4cpp.properties";
log4cpp::PropertyConfigurator::configure(initFileName); log4cpp::Category& root = log4cpp::Category::getRoot(); log4cpp::Category& sub1 =
log4cpp::Category::getInstance(std::string("sub1")); log4cpp::Category& sub2 =
log4cpp::Category::getInstance(std::string("sub1.sub2")); root.warn("Storm is coming"); sub1.debug("Received storm warning");
sub1.info("Closing all hatches"); sub2.debug("Hiding solar panels");
sub2.error("Solar panels are blocked");
sub2.debug("Applying protective shield");
sub2.warn("Unfolding protective shield");
sub2.info("Solar panels are shielded"); sub1.info("All hatches closed"); root.info("Ready for storm."); log4cpp::Category::shutdown(); return ;
}

main.cpp

编译:g++ main.cpp -L/usr/local/lib -llog4cpp -pthread -I/usr/local/include -o main

log配置文件:log4cpp.properties

log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.sub1=DEBUG, A1, A2
log4cpp.category.sub1.sub2=DEBUG, A3 log4cpp.appender.rootAppender=ConsoleAppender
log4cpp.appender.rootAppender.layout=PatternLayout
log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%p] %m%n log4cpp.appender.A1=FileAppender
log4cpp.appender.A1.fileName=A1.log
log4cpp.appender.A1.layout=BasicLayout log4cpp.appender.A2=FileAppender
log4cpp.appender.A2.threshold=WARN
log4cpp.appender.A2.fileName=A2.log
log4cpp.appender.A2.layout=PatternLayout
log4cpp.appender.A2.layout.ConversionPattern=%d [%p] %m%n log4cpp.appender.A3=RollingFileAppender
log4cpp.appender.A3.fileName=A3.log
log4cpp.appender.A3.maxFileSize=
log4cpp.appender.A3.maxBackupIndex=
log4cpp.appender.A3.layout=PatternLayout
log4cpp.appender.A3.layout.ConversionPattern=%d [%p] %m%n

4.简单封装

Log.h

#ifndef LOG_H
#define LOG_H #include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>
#include <log4cpp/Priority.hh> #include <stdarg.h>
#include <syslog.h> // confirm to log4cpp::priority::PriorityLevel
#define DEBUG_LEVEL 700
#define INFO_LEVEL 600
#define WARN_LEVEL 400
#define ERROR_LEVEL 300
#define FATAL_LEVEL 0 #define LOG(level,format, args...) do {\
Log::getInstance().write(level, __FUNCTION__, format, ##args);\
}while(); class Log
{
public:
static Log& getInstance() { return instance_;}
void write(int level, const char* func, const char* format, ...); private:
Log();
virtual ~Log(); void init();
void cleanup(); log4cpp::Priority::Value currentPriority();
void formatFunc(const char* func, const char* format, va_list alist, std::string& msg); private:
static Log instance_;
log4cpp::Category* logger_;
}; #endif // LOG_H

Log.h

Log.cpp

#include "Log.h"

#include <syslog.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/timeb.h>
#include <time.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdexcept>
#include <log4cpp/Configurator.hh> using std::string; #define BUF_LEN 4096 //int fdLog_ = -1;
Log Log::instance_; Log::Log()
{
syslog(LOG_INFO, "Log constructor");
init();
} Log::~Log()
{
syslog(LOG_INFO, "Log deconstructor");
cleanup();
} void Log::init()
{
logger_ = NULL; try {
std::string basePath("/myapp/lib/");
std::string confFile = basePath + "log4cpp.priority"; log4cpp::PropertyConfigurator::configure(confFile);
log4cpp::Category& root = log4cpp::Category::getRoot(); log4cpp::Category& sub1 =
log4cpp::Category::getInstance(std::string("sub1")); logger_ = &sub1;
} catch(std::exception const& e) {
syslog(LOG_NOTICE, "init log error[%s]", e.what());
} catch(...) {
syslog(LOG_INFO, "init log error[%d, %s]", errno, strerror(errno));
} syslog(LOG_INFO, "log init finished");
} void Log::cleanup()
{
log4cpp::Category::shutdown();
} int Log::currentPriority()
{
if (logger_) {
return logger_->getPriority();
} return INFO_LEVEL;
} void Log::write(int level, const char* func, const char* format, ...)
{
if (Config::getInstance().NoLogOutput_) {
return;
}
if (level > currentPriority()) {
return;
}
if (NULL == logger_) {
return;
} std::string info;
va_list alist;
va_start (alist, format);
formatFunc(func, format, alist, info);
va_end(alist); try {
switch(level) {
case FATAL_LEVEL:
logger_->fatal(info);
break;
case ERROR_LEVEL:
logger_->error(info);
break;
case WARN_LEVEL:
logger_->warn(info);
break;
case INFO_LEVEL:
logger_->info(info);
break;
case DEBUG_LEVEL:
logger_->debug(info);
break;
default:
break;
}
} catch(...) {
syslog(LOG_INFO, "output log failed");
}
} void Log::formatFunc(const char* func, const char* format, va_list alist, std::string& msg)
{
char buf[BUF_LEN] = {}; int prefixLen = snprintf(buf, BUF_LEN-, " 0x%lX %s(): ",\
pthread_self(), func); int contentLen = vsnprintf(buf+prefixLen, BUF_LEN--prefixLen, format, alist); int dataLen = prefixLen + contentLen;
buf[dataLen] = '\n'; msg = buf;
}
#endif

Log.cpp

log4cpp安装使用的更多相关文章

  1. log4cpp安装

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  2. 一步步入门log4cpp

    前言 项目实现过程中,需要检查.查找或者调试程序bug等,此时程序日志则较为清晰地展现代码的运行过程.目前接触到的方法有打印消息到控制台,将重要信息输出到某个文件比如txt文件,或者直接使用日志库. ...

  3. VS2012编译log4cpp1.1.1版本

    1.起因 看到官方网站上的log4cpp的代码已经更新到了1.1.1,而我目前使用的1.0.3版本,所以想使用下最新版本.在使用过程中发现相对于老版本,新版本的变化还是比较大的,特写下此文记录下. 2 ...

  4. 基于线程池、消息队列和epoll模型实现并发服务器架构

    引言 并发是什么?企业在进行产品开发过程中为什么需要考虑这个问题?想象一下天猫的双11和京东的618活动,一秒的点击量就有几十万甚至上百万,这么多请求一下子涌入到服务器,服务器需要对这么多的请求逐个进 ...

  5. GNU Radio安装教程: Ubuntu14.04 + uhd3.10.0 + gnuradio3.7.10.1

    1. 更新和安装依赖项 在编译安装uhd和gnuradio之前,确保已安装所需依赖项.Ubuntu系统运行: sudo apt-get update 安装UHD和GNURadio所需依赖项: On U ...

  6. QT应用程序 安装路径中文异常问题

    [1]QT 安装中文路径启动异常问题 最近在搞一个很简单的QT应用程序,开发环境VS2017 + QT5.9,线上异常报错:安装中文路径下启动崩溃~~~~ 最后,本地调试Debug版本,发现安装中文路 ...

  7. C++之log4cpp库的使用

    log4..简介 log4..是基于log4j的一系列的c++移植版本,使用了log4j的模式结构,目前主要有以下几个版本: 1. log4cxx, 目前是到0.10.0版,Apache下的孵化项目, ...

  8. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  9. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法

    如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...

随机推荐

  1. bzoj4763

    $分块$ $一个很有趣的技巧$ $在树上选sqrt(n)个关键点,每两个关键点之间的距离<=sqrt(n),每个关键点属于一条链$ $预处理出每两个关键点的bitset$ $每次询问就暴力向上爬 ...

  2. MATLAB 内存容量修改 zz

    MATLAB 内存容量修改 - Oliver的日志 - 网易博客 在用MATLAB做图像处理时 经常会碰到内存溢出的情况,可用如下方法修改,使得MATLAB的内存容量最大: 出自matlab:matl ...

  3. [poj1236]Network of Schools(targin缩点SCC)

    题意:有N个学校,从每个学校都能从一个单向网络到另外一个学校.1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件.2:至少需要添加几条边,使任意向一个学校发放软件后,经过若干次 ...

  4. php学习笔记-PHP中的几个取整函数

    floor是向下取整,比如4.5,它是在4和5之间的一个数,那么结果就是4. ceil是向上取整,比如3.7,它是在3和4之间的一个数,那么结果就是4. round是对一个数四舍五入,小数部分如果小于 ...

  5. pig ERROR 2997: Encountered IOException. File or directory null does not exist.

    grunt> ls 2014-03-30 19:58:31,344 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2997: Enc ...

  6. 【异步编程】Part2:掌控SynchronizationContext避免deadlock

    引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原 ...

  7. Fedora/CentOS使用技巧

    命令 获取系统安装包的编译源码及脚本 # dnf download --source package # yumdownloader --source virt-viewer 远程连接windows ...

  8. 多行文字超出字数部分省略(主要解决不兼容;display: -webkit-box;的浏览器)

    注明:内容来处https://www.cnblogs.com/ss977/p/5846176.html 1.现webkit内核的浏览器支持display: -webkit-box;属性, 所以网页中显 ...

  9. 洛谷P3757 [CQOI2017]老C的键盘

    传送门 首先可以直接把整个序列建成一个完全二叉树的结构,这个应该都看得出来 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小 ...

  10. scrapy爬取数据的基本流程及url地址拼接

    说明:初学者,整理后方便能及时完善,冗余之处请多提建议,感谢!   了解内容: Scrapy :抓取数据的爬虫框架     异步与非阻塞的区别   异步:指的是整个过程,中间如果是非阻塞的,那就是异步 ...