log4cpp安装使用
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安装使用的更多相关文章
- log4cpp安装
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 一步步入门log4cpp
前言 项目实现过程中,需要检查.查找或者调试程序bug等,此时程序日志则较为清晰地展现代码的运行过程.目前接触到的方法有打印消息到控制台,将重要信息输出到某个文件比如txt文件,或者直接使用日志库. ...
- VS2012编译log4cpp1.1.1版本
1.起因 看到官方网站上的log4cpp的代码已经更新到了1.1.1,而我目前使用的1.0.3版本,所以想使用下最新版本.在使用过程中发现相对于老版本,新版本的变化还是比较大的,特写下此文记录下. 2 ...
- 基于线程池、消息队列和epoll模型实现并发服务器架构
引言 并发是什么?企业在进行产品开发过程中为什么需要考虑这个问题?想象一下天猫的双11和京东的618活动,一秒的点击量就有几十万甚至上百万,这么多请求一下子涌入到服务器,服务器需要对这么多的请求逐个进 ...
- GNU Radio安装教程: Ubuntu14.04 + uhd3.10.0 + gnuradio3.7.10.1
1. 更新和安装依赖项 在编译安装uhd和gnuradio之前,确保已安装所需依赖项.Ubuntu系统运行: sudo apt-get update 安装UHD和GNURadio所需依赖项: On U ...
- QT应用程序 安装路径中文异常问题
[1]QT 安装中文路径启动异常问题 最近在搞一个很简单的QT应用程序,开发环境VS2017 + QT5.9,线上异常报错:安装中文路径下启动崩溃~~~~ 最后,本地调试Debug版本,发现安装中文路 ...
- C++之log4cpp库的使用
log4..简介 log4..是基于log4j的一系列的c++移植版本,使用了log4j的模式结构,目前主要有以下几个版本: 1. log4cxx, 目前是到0.10.0版,Apache下的孵化项目, ...
- docker——容器安装tomcat
写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...
- 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法
如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...
随机推荐
- lwip【6】LWIP使用经验
LWIP使用经验 一 LWIP内存管理 LWIP的内存管理使用了2种方式:内存池memp和内存堆mem,如图1所示. 内存池的特点是预先开辟多组固定大小的内存块组织成链表,实现简单,分配和回收速度快, ...
- java.lang.NoClassDefFoundError: org/springframework/dao/support/DaoSupport
转自:https://blog.csdn.net/lzx159951/article/details/79753493 1. 缺少:org.springframework.transaction-3. ...
- java——构造方法重载
class Person { private String name ; private int age ; public Person() { } public Person(String n,in ...
- day4 函数重载
函数的重载 1.函数重载的定义:在同一个类中,有一个以上的同名函数,只要函数的参数列表或参数类型不一样即可,与返回值无关, 这些统称为方法的重载. 2.函数的重载存在的原因:为了增强方法的阅读性,优化 ...
- 使用WSAIoctl获取AcceptEx函数指针 [转]
Winsock2的其他供应商不一定会实现AcceptEx函数.同样情况也包括的其他Microsoft的特定APIs如TransmitFile,GetAcceptExSockAddrs以及其他Micro ...
- C++ 无边框的拖动窗口代码
按下鼠标时,记录下鼠标在窗体上的坐标, 同时用一个BOOL变量记录下鼠标左键按下的状态 弹起左键,则记录状态的布尔变量为FALSE. 处理鼠标移动事件,如果左键同时按下,则为鼠标拖动窗体运动,设置窗体 ...
- 关于 == 和 equals() 的区别
对于正在学习java的,以及入行不久的小伙伴们,在面试中经常会被面试官问到 " == 和 equals() 的区别 ?"的问题,你是否回答好了呢? 示例一: //两个基本类型数据 ...
- cassandra的命令
cassandra的命令: connect <hostname>/<port> (<username> '<password>')?; Conne ...
- ps色彩混合
http://tieba.baidu.com/p/2032536851?pn=1 HSB 这是一种颜色的表示方法:其中"H"表示色相,"S"表示饱和度,&quo ...
- cogs 421. HH的项链
421. HH的项链 http://218.28.19.228/cogs/problem/problem.php?pid=421 ★★★ 输入文件:diff.in 输出文件:diff.out ...