Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5739059
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2009-02-08 22:39:43

为了给项目增加一个log库,找了一些开源的库,包括log4cpp、log4cxx。

总得来说,log4cxx是功能最彪悍的一个,是线程安全的,支持的PatternLayout符号表示的语义也最多,但是唯一不好的一点就是它需要apr库,有些不爽。log4cpp倒是一个单独的库,但是不是完整的支持线程安全。两个库的配置文件都跟log4j一样,两者的API也差不多,hacking了一个下午,封装了一个库,将log4cpp和log4cxx的接口统一起来了。

logger.h
#ifndef _LOGGER_H
#define _LOGGER_H

#include
using namespace std;

#ifdef USE_LOG4CPP
#include "log4cpp/Category.hh"
#include "log4cpp/CategoryStream.hh"
#include "log4cpp/PropertyConfigurator.hh"

using namespace log4cpp;
#elif defined USE_LOG4CXX
#include
#include
using namespace log4cxx;
#endif

#define LoggerName "MyApp"
#define AppenderName "rootAppender"

#ifdef USE_LOG4CPP

extern log4cpp::Category *logger_;
#define LOG_DEBUG(msg) \
    LOG4CPP_DEBUG_S((*logger_))<#define LOG_INFO(msg) \
    LOG4CPP_INFO_S((*logger_))<#define LOG_WARN(msg) \
    LOG4CPP_WARN_S((*logger_))<#define LOG_ERROR(msg) \
    LOG4CPP_ERROR_S((*logger_))<#define LOG_FATAL(msg) \
    LOG4CPP_FATAL_S((*logger_))<
#elif defined USE_LOG4CXX

extern LoggerPtr logger_;
#define LOG_DEBUG(msg) \
{\
    stringstream temp_; \
    temp_<    LOG4CXX_DEBUG(logger_, temp_.str()); \
}
#define LOG_INFO(msg) \
{\
    stringstream temp_; \
    temp_<    LOG4CXX_INFO(logger_, temp_.str()); \
}
#define LOG_WARN(msg) \
{\
    stringstream temp_; \
    temp_<    LOG4CXX_WARN(logger_, temp_.str()); \
}
#define LOG_ERROR(msg) \
{\
    stringstream temp_; \
    temp_<    LOG4CXX_ERROR(logger_, temp_.str()); \
}
#define LOG_FATAL(msg) \
{\
    stringstream temp_; \
    temp_<    LOG4CXX_FATAL(logger_, temp_.str()); \
}

#endif

void InitLog(const char *conf_file);

#endif /*_LOGGER_H*/

logger.cpp
#include "logger.h"

#ifdef USE_LOG4CPP
log4cpp::Category *logger_;
#elif defined USE_LOG4CXX
LoggerPtr logger_(Logger::getLogger(LoggerName));
#endif

void InitLog(const char *conf_file)
{
#ifdef USE_LOG4CPP
    log4cpp::PropertyConfigurator::configure(conf_file);
    log4cpp::Category& log = log4cpp::Category::getInstance(string(AppenderName));
    logger_ = &log;
#elif defined USE_LOG4CXX
    PropertyConfigurator::configure(File(conf_file)); // Configure file, log4j format
    logger_ = Logger::getLogger("org.apache.log4j.RollingFileAppender"); // Appender name
#endif
}

#if 0
int main(int argc, char* argv[])
{
    string conf_file = "./log.conf";
    InitLog(conf_file.c_str());

    LOG_DEBUG("This is Some Debug Message.");
    LOG_INFO("This is Some Info Message.");
    LOG_WARN("This is Some Warn Message.");
    LOG_ERROR("This is Some Error Message.");
    LOG_FATAL("This is Some Fatal Message.");
    
    return 0;
}
#endif

封装之后的库,在InitLog(conf_file)之后,就可以直接使用LOG_DEBUG(msg)的方式写log了,直接修改配置文件就可以控制log的行为了;-)

log.conf
log4j.rootCategory=INFO, rootAppender

log4j.Category.rootAppender=INFO
log4j.appender.rootAppender=org.apache.log4j.RollingFileAppender
#由于log4cpp无法处理"MB"等字母表示的文件大小,为了兼容性,建议直接使用数字表示。
#log4j.appender.rootAppender.maxFileSize = 1MB
log4j.appender.rootAppender.maxFileSize = 1024000
log4j.appender.rootAppender.maxBackupIndex = 2
log4j.appender.rootAppender.append=true
log4j.appender.rootAppender.fileName=emule.log

log4j.appender.rootAppender.layout=org.apache.log4j.PatternLayout
#log4j.appender.rootAppender.layout.ConversionPattern=%p [%d] %F | %m%n
log4j.appender.rootAppender.layout.ConversionPattern=[%d] %-5p | %m%n

注意:使用log4cpp的配置文件时,RollingFileAppender方式设置的maxFileSize不能够使用"MB"等字母,需要直接填写数字;log4cxx没有这个问题。因此,在设置maxFileSize时候建议直接使用数字,而不是"MB"等字母表示。

使用的时候,通过定义不同的宏来使用不同的库,例如使用log4cpp,编译的时候,使用-DUSE_LOG4CPP宏,并在链接的时候,使用-llog4cpp进行库链接;同理使用log4cxx。

Makefile.log4cpp
CXX=g++
CXXFLAGS=-g -fPIC -c -DUSE_LOG4CPP
LDFLAGS=-llog4cpp
OBJS= logger.o
PROG=t_log

all: t_log

.cpp.o :
    $(CXX) $(CXXFLAGS) $(INCLUDE) $<

t_log: t_log.o $(OBJS)
    $(CXX) -o $@ $^ $(LDFLAGS)

clean:
    rm -f *.o
    rm -f $(PROG)



文件:logger.tar.gz
大小:1KB
下载:下载

参考:
http://www.ibm.com/developerworks/cn/java/jw-log4j/index.html
http://www.ibm.com/developerworks/cn/linux/l-log4cpp/index.html
http://erera.net/blog/log4cxx.html
http://blogs.sun.com/amitsaha/entry/a_simple_file_logger_with

阅读(4506) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~