configure请加入–with-pthreads 或者–with-omnithreads选项。Win版本已经加入对MS线程的支持。
#include <stdio.h>
#include <time.h>
#include <iostream>
#include <boost/circular_buffer.hpp>
#include <thread>
#include <mutex>
#include <vector>
#include <stdio.h>
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/SimpleLayout.hh>
#include "log4cpp/PropertyConfigurator.hh"
using namespace std;
std::mutex g_mutex; // protects g_i
// 1. circular_buffer 在多线程下是否需要加锁
// ---- thread1 write
// ---- thread2 read
// ---- thread3 write
boost::circular_buffer<int> cb(3);
void thread1_foo()
{
int i = 0;
while(i++ < 1000)
{
cb.push_back(i);
{
lock_guard<std::mutex> lock(g_mutex);
cout << "thread1 write: " << i << endl;
}
}
}
void log_test()
{
try
{
log4cpp::PropertyConfigurator::configure("./log4cpp.conf");
}
catch (log4cpp::ConfigureFailure& f)
{
std::cout << "Configure Problem " << f.what() << std::endl;
}
log4cpp::Category& root = log4cpp::Category::getRoot();
log4cpp::Category& sub3 = log4cpp::Category::getInstance(std::string("sub3"));
for(int i = 0; i < 100; i++)
{
sub3.fatal("some test");
}
}
void thread2_foo()
{
int i = 0;
while(i++ < 2000)
{
if(cb.empty())
{
continue;
}
int a = cb[0];
cb.pop_front();
{
lock_guard<std::mutex> lock(g_mutex);
cout<< "thread2 read : "<< a << endl;
}
}
}
#define LOGFILE "./test.log"
int main() {
/*Setting up Appender, layout and Category*/
// log4cpp::Appender *appender = new log4cpp::FileAppender("FileAppender",LOGFILE);//第一个参数是appender的名字,第二个是log文件的名字
// log4cpp::Layout *layout = new log4cpp::SimpleLayout();
// //log4cpp::Layout *layout = new log4cpp::BasicLayout();
// log4cpp::Category& category = log4cpp::Category::getInstance("abc");
//
// appender->setLayout(layout);
// category.setAppender(appender);
// category.setPriority(log4cpp::Priority::INFO);
//
// /*The actual logging*/
// category.info("This is for tracing the flow");
// category.notice("This is to notify certain events");
// category.warn("This is to generate certain warnings");
log_test();
return 0;
}
g++ -std=c++11 -I/usr/local/include -I/users/jiangxf/3rdParty/boost -o log_test log_test.cpp liblog4cpp.a
# 定义了3个category sub1, sub2, sub3
# 其中sub2和sub3设置了additivity属性为false;sub1的additivity属性默认为true
rootCategory=DEBUG, rootAppender
category.sub1=,A1
category.sub2=INFO, A2
additivity.sub2=false
category.sub3=ERROR, A3
additivity.sub3=false
# 定义rootAppender类型和layout属性,这里使用了BasicLayout
appender.rootAppender=org.apache.log4cpp.ConsoleAppender
appender.rootAppender.layout=org.apache.log4cpp.BasicLayout
#定义A1的属性, 这里使用了 SimpleLayout
appender.A1=org.apache.log4cpp.FileAppender
appender.A1.fileName=./log/A1.log
appender.A1.layout=org.apache.log4cpp.SimpleLayout
#定义A2的属性,这里使用了 PatternLayout
appender.A2=org.apache.log4cpp.ConsoleAppender
appender.A2.layout=org.apache.log4cpp.PatternLayout
appender.A2.layout.ConversionPattern=The message '%m' at time %d%n
#定义A3的属性
#appender.A3=org.apache.log4cpp.RollingFileAppender
appender.A3=org.apache.log4cpp.ConsoleAppender
appender.A3.fileName=./log/A3.log
appender.A3.maxFileSize=50
appender.A3.maxBackupIndex=3
appender.A3.backupPattern=%Y-%m-%d
appender.A3.layout=org.apache.log4cpp.PatternLayout
#appender.A3.layout.ConversionPattern=%d{%Y-%m-%d %H:%M:%S} [%p]: [%c] %m%n
appender.A3.layout.ConversionPattern=%d,%p,%m%n
#%c sub3
#%p fatal
#%m 日志内容
#%n 回车换行