Log4cpp запись журнала повторно

Я использую log4cpp для создания класса Log, который разработан в одноэлементном режиме. Вот мой Log.h

#include <cstdio>
#include <cstring>
#include <cstdarg>
#include <log4cpp/Category.hh>
#include <log4cpp/Appender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/PatternLayout.hh>

class CtagentLog
{
public:
static CtagentLog& getInstance() {
static CtagentLog instance;
return instance;
}

void Log(int type, char *content);

private:
CtagentLog();
CtagentLog(CtagentLog const&);
CtagentLog& operator=(CtagentLog const &);
~CtagentLog();//  char *log_file;
//  log4cpp::PatternLayout *plt;
//  log4cpp::Appender *app;
void itoa(int n, char* str, int radix);

};

и это мой файл Log.cpp:

#include "Log.h"

CtagentLog::CtagentLog()
{
}

CtagentLog::~CtagentLog()
{

}

/*
* type=1 ERROR
* type=2 WARN
* type=3 INFO
*/
void CtagentLog::Log(int type, char *content)
{
log4cpp::PatternLayout *plt = new log4cpp::PatternLayout();
plt->setConversionPattern("[%d] %p %c %x: %m%n");
log4cpp::Appender *app = new log4cpp::FileAppender("fileAppender", "test.log");
app->setLayout(plt);

log4cpp::Category &root = log4cpp::Category::getRoot().getInstance("Test");
root.addAppender(app);
root.setPriority(log4cpp::Priority::DEBUG);
switch(type){
case 1: root.error(content); break;
case 2: root.warn(content); break;
case 3: root.info(content); break;
default: root.info(content); break;
}
}

И наконец мой testmain.cpp:

#include "Log.h"#include <stdio.h>
#include <unistd.h>
#include <pthread.h>void *func1(void *arg)
{
printf("thread 1\n");
}

void *func2(void *arg)
{
printf("thread 2\n");
}

int main(void)
{
pthread_t tid1;
pthread_t tid2;

pthread_create(&tid1, NULL, func1, NULL);
pthread_join(tid1, NULL);
CtagentLog::getInstance().Log(1,"Create Thread 1 Return");
pthread_create(&tid2, NULL, func2, NULL);
pthread_join(tid2, NULL);
CtagentLog::getInstance().Log(1,"Create Thread 2 Return");

return 0;

}

Компилировать с g++ -g Main.cpp Log.cpp -lpthread -llog4cppи запустить его. выход:

# ./a.out
нить 1
нить 2

но test.log выглядит так:

[2013-07-29 21: 32: 34,101] Тест ОШИБКИ: Создать поток 1 Возврат
[2013-07-29 21: 32: 34,101] Тест ERROR: создание потока 2, возврат
[2013-07-29 21: 32: 34,101] Тест ERROR: создание потока 2, возврат

Я хочу знать, почему второй журнал вызовов дважды. Я неправильно использую log4cpp?

0

Решение

Это потому, что вы добавляете новые дополнения каждый раз в Log функция. Каждый новый аппендер, ну и добавляйте вывод. Если бы вы назвали это в третий раз, вы бы получили три выходы.

Такие вещи, как добавление дополнений, настройка макетов или другие подобные одноразовые настройки, должны выполняться только один раз, предпочтительно в конструкторе или в функции инициализации.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]