日誌文件一般會帶上日期,或者創建以日期命名名的文件夾,將日誌文件創建於其中。log4cplus網上有不少教程,但是似乎沒有人說這種方案。事實上源碼裏有這個類TimeBasedRollingFileAppender,就滿足此需求。
#include <cstdio>
#include <string>
#include <pthread.h>
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/fileappender.h>
using namespace std;
static log4cplus::Logger lgPltf = log4cplus::Logger::getInstance("loggerPlatform");
void *threadFun(void *arg) {
char name[64] = {0};
snprintf(name, sizeof(name)-1, "loggerMkt.%s", (const char *)arg);
log4cplus::Logger loggerMkt1 = log4cplus::Logger::getInstance(name);
//snprintf(name, sizeof(nameAppendFile)-1, "SQFront.%s.log", arg);
//log4cplus::SharedAppenderPtr apd(new log4cplus::TimeBasedRollingFileAppender(nameAppendFile));
//std::auto_ptr<log4cplus::Layout> _layout(new log4cplus::TTCCLayout());
//apd->setLayout(_layout);
//loggerCallback.addAppender(apd);
LOG4CPLUS_TRACE_METHOD(loggerMkt1, LOG4CPLUS_TEXT(__FUNCTION__));
LOG4CPLUS_DEBUG(loggerMkt1, "This is a DEBUG message");
LOG4CPLUS_INFO(loggerMkt1, "This is a INFO message");
LOG4CPLUS_WARN(loggerMkt1, "This is a WARN message");
LOG4CPLUS_ERROR(loggerMkt1, "This is a ERROR message");
LOG4CPLUS_FATAL(loggerMkt1, "This is a FATAL message");
return NULL;
}
void printDebug() {
LOG4CPLUS_TRACE_METHOD(lgPltf, LOG4CPLUS_TEXT(__FUNCTION__));
LOG4CPLUS_DEBUG(lgPltf, "This is a DEBUG message");
LOG4CPLUS_INFO(lgPltf, "This is a INFO message");
LOG4CPLUS_WARN(lgPltf, "This is a WARN message");
LOG4CPLUS_ERROR(lgPltf, "This is a ERROR message");
LOG4CPLUS_FATAL(lgPltf, "This is a FATAL message");
}
int main() {
pthread_t pthread1, pthread2;
log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("SQFront.log.properties"));
log4cplus::Logger loggerMktBase = log4cplus::Logger::getInstance("loggerMkt");
pthread_create(&pthread1, NULL, threadFun, (void *)"tdf");
pthread_create(&pthread2, NULL, threadFun, (void *)"gta");
printDebug();
pthread_join(pthread1, NULL);
pthread_join(pthread2, NULL);
return 0;
}
#SQFront.log.properties
---------------------------------------
#這裏命名logger對象。我給logger對象的命名是loggerPlatform(表示輸出程序基礎運行平臺的日誌)和loggerMkt(表示輸出行情業務相關的日誌)
#每個logger對象可以使用多個appender對象(這裏有apdPlatform,apdMkt)。類似於每次打日誌的時候,會輸出到多個文件。(ALL是我調試時用的)
log4cplus.logger.loggerPlatform=ALL, apdPlatform
#, apdStdout
log4cplus.logger.loggerMkt=ALL, apdMkt
#對appender對象apdStdout(這裏我是調試時用的)進行設置。
#log4cplus.appender.apdStdout=log4cplus::ConsoleAppender
#log4cplus.appender.apdStdout.layout=log4cplus::PatternLayout
#log4cplus.appender.apdStdout.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%q} %-5p - %m [%l]%n
#對appender對象apdPlatform進行設置。TimeBasedRollingFileAppender可以按日期轉儲日誌文件
log4cplus.appender.apdPlatform=log4cplus::TimeBasedRollingFileAppender
log4cplus.appender.apdPlatform.FilenamePattern=log/%d{yyyy-MM-dd}/SQFront.log
log4cplus.appender.apdPlatform.Append=true
log4cplus.appender.apdPlatform.MaxHistory=999
log4cplus.appender.apdPlatform.ImmediateFlush=true
log4cplus.appender.apdPlatform.RollOnClose=false
log4cplus.appender.apdPlatform.CreateDirs=true
log4cplus.appender.apdPlatform.layout=log4cplus::PatternLayout
log4cplus.appender.apdPlatform.layout.ConversionPattern=[%T] %D{%Y-%m-%d %H:%M:%S.%q} %-5p - %m [%c]%n
#可不配置。日誌文件會按此等級範圍顯示
#log4cplus.appender.apdRoot.filters.1=log4cplus::spi::LogLevelRangeFilter
#log4cplus.appender.apdRoot.filters.1.LogLevelMin=ERROR
#log4cplus.appender.apdRoot.filters.1.LogLevelMax=FATAL
log4cplus.appender.apdMkt=log4cplus::TimeBasedRollingFileAppender
log4cplus.appender.apdMkt.FilenamePattern=log/%d{yyyy-MM-dd}/SQFront.mkt.log
log4cplus.appender.apdMkt.Append=true
log4cplus.appender.apdMkt.MaxHistory=999
log4cplus.appender.apdMkt.ImmediateFlush=true
log4cplus.appender.apdMkt.RollOnClose=false
log4cplus.appender.apdMkt.CreateDirs=true
log4cplus.appender.apdMkt.layout=log4cplus::PatternLayout
log4cplus.appender.apdMkt.layout.ConversionPattern=[%T] %D{%Y-%m-%d %H:%M:%S.%q} %-5p - %m [%c]%n